#include <bits/stdc++.h>
using namespace std;
int n,m,tre[10003*4],laz[10003*4];
void pushdown(int num){
if(laz[num]!=0){
tre[num*2]+=laz[num];
tre[num*2+1]+=laz[num];
laz[num*2]+=laz[num];
laz[num*2+1]+=laz[num];
laz[num]=0;
}
}
void update(int num,int le,int ri,int x,int y,int z){
if(x<=le&&y>=ri){
tre[num]+=z; laz[num]+=z; return ;
}
pushdown(num);
int mid=(le+ri)/2;
if(x<=mid) update(num*2,le,mid,x,y,z);
if(y>mid) update(num*2+1,mid+1,ri,x,y,z);
}
int query(int num,int le,int ri,int x,int y,int k){
if(le==ri)return le;
pushdown(num);
int mid=(le+ri)/2;
if(tre[num*2+1]>k) //往右儿子扫
query(num*2+1,mid+1,ri,x,y,k);
else //往左儿子扫
query(num*2,le,mid,x,y,k);
}
int main(void){
cin>>n>>m;
while(m--){
int a,b,c,d;cin>>a>>b>>c>>d;
if(a==1)update(1,1,n,b,c,d);
else cout<<query(1,1,n,b,c,d)<<endl;
//cout<<tre[1]<<endl;
//cout<<tre[2]<<' '<<tre[3]<<endl;
//cout<<tre[4]<<' '<<tre[5]<<' ';
//cout<<tre[6]<<' '<<tre[7]<<endl;
}
return 0;
}
权值线段树
定义:以权值为关键字的一棵线段树
用途:快速求一个区间的第k大(或小)数
模板题:n个数开始全为0,m个操作
1号操作表示[b,c]内的数全部+d
2号操作表示求[b,c]内第d大的数
Input output
2 5 2
1 1 2 1 2
1 1 2 2 1
2 1 1 2
2 1 1 1
2 1 2 3
TIPS:跟线段树的区别只是存的是权值