#include #include #include using namespace std; int BL=100; int n,q; long long arr[300300]; int nxt[300300]; int cnt[300300]; long long mask[100010]; long long st[300300]; int si=0; int steps[300300]; int stop[300300]; int ind[300300]; void update_block(int x){ if(x<0)return; if(mask[x]) for(int i=BL*x;i= (x+1)*BL;i--){ while(si>0 && arr[i] >= st[si-1]){ si--; } st[si]=arr[i]; steps[si]=0; stop[si]=i; ind[si]=i; si++; } for(int i=min(n,(x+1)*BL)-1; i>= x*BL;i--){ while(si>0 && arr[i] >= st[si-1]){ si--; } if(si==0 || ind[si-1] - i > BL){ /*st[si]=arr[i]; steps[si]=0; stop[si]=i; ind[si]=i; si++;*/ cnt[i]=0; nxt[i]=-1; } else { st[si]= arr[i]; steps[si]=steps[si-1]+1; stop[si]= stop[si-1]; ind[si]= i; cnt[i]= steps[si]; nxt[i]= stop[si]; si++; } } } int answer(int place,int remain){ while(true){ if(cnt[place] > remain){ break; } if(cnt[place] ==0 ){ break; } remain -= cnt[place]; place = nxt[place]; } if(remain == 0)return place; int cur=place/BL; for(int i=place +1 ;i arr[place]){ place = i; remain--; } } return place; } void edit_range(int l,int r,int x){ if(l/BL == r/BL){ int xx = l/BL; for(int i=l;i<=r;i++){ arr[i] += x; } update_block(xx); update_block(xx-1); return; } int rbl = r/BL; int lbl = l/BL; for(int i=rbl * BL ;i<= r;i++){ arr[i] += x; } for(int i=l ;i< (lbl+1)*BL;i++){ arr[i] += x; } for(int i=lbl+1;i>n>>q; for(int i=0;i>arr[i]; } for(int i=(n-1)/BL;i>=0;i--){ update_block(i); } for(int i=0;i>ty; if(ty==1){ int ind,k; cin>>ind>>k; cout<>l>>r>>x; edit_range(l-1,r-1,x); } } }