【原题1】
3110: [Zjoi2013]K大数查询
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 978 Solved: 476
Description
有N个位置,M个操作。操作有两种,每次操作假设是1 a b c的形式表示在第a个位置到第b个位置,每一个位置增加一个数c
假设是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。
Input
第一行N。M
接下来M行。每行形如1 a b c或2 a b c
Output
输出每一个询问的结果
Sample Input
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
Sample Output
1
2
1
HINT
N,M<=50000,N,M<=50000
a<=b<=N
1操作中abs(c)<=N
2操作中abs(c)<=Maxlongint
【传送门】感谢这位大牛给我的启示。
http://www.cnblogs.com/lazycal/archive/2013/08/05/3239304.html
【分析】一直听到过有一种奇妙的数据结构——树套树。
于是通过这道题我開始接触这样的算法。
树套树的本质就是两棵树套在一起(一般最外层的都是线段树)。对于当前的这棵树的每一个结点能够再开一棵树来维护。由于会爆内存,所以注意要动态开结点。说起来有点玄乎,先看看这道题吧。
我们能够先开一颗权值线段树。对于当前结点K,它表示了权值范围为a~b的全部结点的信息。可是有人要问:这样怎么控制位置范围是l~r这个要求呢?我们能够在这个点上再开一棵