RT,第11个点改了半天,一直过不去,刚开始我没有回收利用,所以我猜是数组越界了,后来回收了,要不WA要不就是依旧RE……我真服了(神犇们快救救这个蒟蒻吧)!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int IN(ll &k){
k=0;char ch=getchar();
while(!isdigit(ch)){ch=getchar();}
while(isdigit(ch)){k=(k<<1)+(k<<3)+(ch^48);ch=getchar();}
}
const int N=2e5+2;
ll n,mx,m,a[N];
struct SegmentTree{
int l,r;ll s;
#define l(x) t[x].l
#define r(x) t[x].r
#define s(x) t[x].s
}t[N<<5];
int root[N],tot;
int bac[N<<5],ct;
inline void Del(int k){
l(k)=r(k)=s(k)=0;
bac[++ct]=k;
}
inline int NewNode(){
if(ct) return bac[ct--];
return ++tot;
}
void build(int &p,int l,int r)
{
if(!p) p=NewNode();
s(p)=a[r]-a[l-1];
if(l==r) return ;
int mid=l+r>>1;
if(a[mid]-a[l-1]) build(l(p),l,mid);
if(a[r]-a[mid]) build(r(p),mid+1,r);
}
void insert(int &p,int l,int r,int val,int cnt){
if(!p) p=NewNode();
s(p)+=cnt;
if(l==r) return ;
int mid=l+r>>1;
if(val<=mid) insert(l(p),l,mid,val,cnt);
else insert(r(p),mid+1,r,val,cnt);
}
void split(int &p,int &k,int l,int r,int L,int R){
if(!s(k)) return ;
if(l>=L&&r<=R){
p=k;k=0;return ;
}
if(!p) p=NewNode();
int mid=l+r>>1;
if(mid>=L) split(l(p),l(k),l,mid,L,R);
if(mid<R) split(r(p),r(k),mid+1,r,L,R);
s(p)=s(l(p))+s(r(p));s(k)=s(l(k))+s(r(k));
}
void merge(int &p,int k,int l,int r){
if(!s(k)) return ;
if(!p) p=NewNode();
s(p)+=s(k);
if(l==r) return ;
int mid=l+r>>1;
merge(l(p),l(k),l,mid);
merge(r(p),r(k),mid+1,r);
Del(k);
}
ll ask(int p,int l,int r,int L,int R){
if(!p) return 0;
if(l>=L&&r<=R) return s(p);
ll anx=0;int mid=l+r>>1;
if(mid>=L) anx+=ask(l(p),l,mid,L,R);
if(mid<R) anx+=ask(r(p),mid+1,r,L,R);
return anx;
}
int Ask(int p,int l,int r,int k){
if(!p||k>s(p)) return -1;
if(l==r) return l;
int mid=l+r>>1;
if(s(l(p))>=k) return Ask(l(p),l,mid,k);
else return Ask(r(p),mid+1,r,k-s(l(p)));
}
void print(ll x){
if(x<0) putchar('-'),x=~x+1;
if(x>9) print(x/10);putchar(x%10+48);
}
inline void Pt(ll x){
print(x);putchar('\n');
}
void put(int p,int l,int r){
printf("%d %d %d %d %d %d\n",p,l,r,l(p),r(p),s(p));
int mid=l+r>>1;if(l==r) return ;
put(l(p),l,mid);put(r(p),mid+1,r);
}
int cnt=1;ll g;
int main(){
// freopen("data.out","w",stdout);
IN(n);IN(m);
for(int i=1;i<=n;i++)
IN(g),a[i]=a[i-1]+g;
build(root[1],1,n);
while(m--)
{
ll opt,p,x,y,q,t,k;IN(opt),IN(p);
switch(opt) {
case 0: IN(x),IN(y);split(root[++cnt],root[p],1,n,x,y);break;
case 1: IN(t);merge(root[p],root[t],1,n);break;
case 2: IN(x),IN(q);insert(root[p],1,n,q,x);break;
case 3: IN(x),IN(y);Pt(ask(root[p],1,n,x,y));break;
case 4: IN(k);Pt(Ask(root[p],1,n,k));break;
}
// printf("/*\n");put(root[1],1,n);printf("*/\n");
}
return 0;
}