第一题没什么好说的。
    第二题本人想到了2种方法(笔试中用第一种方法AC了)。

        方法1:用map或者有序数列二分查询来将喜好程度离散化(离散化后每个喜好程度对应1~n的一个数),建立一个数组cnt,保存每个数出现的次数。
        将问题按区间左界升序排序,则问题也一定是按区间右界升序的(题目中有说明)。对于每个问题,直接去cnt数组中查询可得到结果。
        对于2个相邻的问题,设区间为[L1 , R1] 和[ L2 ,R2 ],则我们需要使cnt数组减去[ L1 ,L2 )区间内所有的喜好程度数量,加上( R1, R2]区间内所有的喜好程度数量。则下一个问题也直接能从cnt数组中查询。
        结束之后,将所有的问题按提问顺序排序并输出。
        总时间复杂度为O(nlogn+q)。
        
        方法2:建立一棵普通的线段树,线段树初始状态为全0。用来查询区间的数量总和。用将问题和用户都按喜好程度升序排序。对于一批喜好程度为k的问题,将所有喜好程度为k的用户,以权值1存入线段树,并用线段树得出这批问题的结果;然后将所有喜好程度为k的用户,以权值-1存入线段树(相当于删除原来对线段树的改动)此时线段树变成全0的初始状态,然后继续处理下一批。
        结束之后,将所有的问题按提问顺序排序并输出。
        由于每个元素仅有2次存入线段树的操作(权值分别为1和-1),每个问题q以logn的复杂度得到结果,再考虑排序耗费的时间,总时间复杂度为O((n+q)logn+qlogq)。

        点评:方法1和方法2的复杂度均为nlogn级别的,在此题的数据量下并不会超时。方法1的实现更为简单,但其利用了题目中对与区间的限定,而方法2的实现稍为复杂,但并不需要题目的特殊约定。