题目来源:《高级数据结构》
题意
有一列整数,共n个。每次可以对这些整数有两种操作:
(1)第i个到第j个整数分别加上数p;
(2)询问这些数中比t小的数的个数。
输入
第一行有两个数,n和m(1≤n≤100000,m≤10000),表示数的个数和操作数。
第二行n个整数,表示每个数的初始值。
以后m行,每行开始一个数q。若q为1,则后面跟三个数:i和j(i≤j)表示两个下标,p(-1000≤p≤1000)表示修改的数;若q为2,则为询问操作,后面跟一个数t。
输出
对每个询问操作输出数列中比t小的数的个数。
题解
首先说明,大佬们看到这两种操作,很快就会想到线段树和平衡树,所以这道题也可以用树套树做。
可是本蒟蒻不会啊,无奈又找不到题解,于是在弃疗一周以后再次翻出来打,居然AC了!用的是非常淳朴的分块暴力。链表非常zz,其实根本都可以不用,因为没有插入和删除的动作(而这道题中每个数的值与标号是无关的,而我们的判断肯定会先分块排好序,所以如果要分链表,是无法实现的)。
这道题我们可以按标号升序建立 n−−