1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; template <typename T> inline void read(T&x){ int w=0;x=0; char ch = getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') w=1; ch = getchar(); } while(ch>='0' && ch<='9'){ x = (x<<1)+(x<<3)+(ch^48); ch = getchar(); } if(w) x=-x; } template <typename T,typename...Args> inline void read(T&t,Args&...args){ read(t);read(args...); } template <typename T> inline T Max(T x,T y){ return (x > y ? x : y); } const int N = 6e6+10; int n,m; int P=1,DEP=0; struct Tree{ ll mx; int pos; Tree(){ mx = 0; pos = 0; } Tree(ll tmx,int tpos){ mx = tmx; pos = tpos; } inline Tree operator + (const Tree&G) const{ if(mx==G.mx) return Tree(mx,Max(pos,G.pos)); else if(mx>G.mx) return Tree(mx,pos); else return G; } }tr[N*3]; ll tag[N*3]; int main(){
read(n,m); while(P<=n+1) P<<=1; for(int i=1,x;i<=n;++i){ read(x); tr[i+P] = Tree(1ll*x,i); } for(int i=P-1;i;--i) tr[i] = tr[i<<1]+tr[i<<1|1]; for(int i=1,opt,x,y;i<=m;++i){ read(opt,x,y); if(opt==1){ int l = 1+P-1,r = x+P+1; ll k = 1ll*y; while(l^1^r){ if(~l&1) tr[l^1].mx+=k,tag[l^1]+=k; if(r&1) tr[r^1].mx+=k,tag[r^1]+=k; l>>=1;r>>=1; tr[l] = tr[l<<1]+tr[l<<1|1]; tr[l].mx += tag[l]; tr[r] = tr[r<<1]+tr[r<<1|1]; tr[r].mx += tag[r]; } for(l>>=1; l ;l>>=1){ tr[l] = tr[l<<1]+tr[l<<1|1]; tr[l].mx += tag[l]; } } else{ int l = 1+P-1,r = y+P+1; Tree resl,resr; while(l^1^r){ if(~l&1) resl = resl+tr[l^1]; if(r&1) resr = tr[r^1]+resr; l>>=1;r>>=1; resl.mx += tag[l]; resr.mx += tag[r]; } printf("%d\n",Max(0,x-(resl+resr).pos)); } }
return 0; }
|