AC几个点,MLE几个点,WA几个点 MLE的点跑得挺快,WA的点下不了数据没能调
#include <iostream>
using namespace std;
typedef long long ll;
const int N=4e5+10;
int n,m;
int rt[N],tot;
int p,q,xx;
int cnt,bc[N*20],cc;
int v,opt,num,num2,tmp;
struct node{
int lson,rson;
ll sz;
}t[N*20];
void del(int id)
{
bc[++cc]=id;
t[id].lson=0;
t[id].rson=0;
t[id].sz=0;
}
int nd()
{
if(cc) return bc[cc--];
else return ++cnt;
}
void pushup(int id)
{
t[id].sz=t[t[id].lson].sz+t[t[id].rson].sz;
}
void add(int id,int l,int r,int u,int x)
{
if(l==r) return t[id].sz+=x,void();
t[id].sz+=x;
int mid=l+r>>1;
if(u<=mid)
{
if(!t[id].lson) t[id].lson=nd();
add(t[id].lson,l,mid,u,x);
}
else
{
if(!t[id].rson) t[id].rson=nd();
add(t[id].rson,mid+1,r,u,x);
}
}
int merge(int x,int y)
{
if(!x || !y) return x|y;
t[x].sz+=t[y].sz;
t[x].lson=merge(t[x].lson,t[y].lson);
t[x].rson=merge(t[x].rson,t[y].rson);
del(y);
return x;
}
ll ask(int id,int l,int r,int ll,int rr)
{
if(l==ll && r==rr) return t[id].sz;
int mid=l+r>>1;
if(rr<=mid) return ask(t[id].lson,l,mid,ll,rr);
else if(ll>mid) return ask(t[id].rson,mid+1,r,ll,rr);
else return ask(t[id].lson,l,mid,ll,mid)+ask(t[id].rson,mid+1,r,mid+1,rr);
}
int kth(int id,int l,int r,ll k)
{
if(l==r) return l;
int mid=l+r>>1;
if(t[t[id].lson].sz>=k) return kth(t[id].lson,l,mid,k);
else return kth(t[id].rson,mid+1,r,k-t[t[id].lson].sz);
}
void split(int x,int &y,ll k)
{
if(!x) return;
y=nd();
if(t[t[x].lson].sz>=k) swap(t[x].rson,t[y].rson);
if(t[t[x].lson].sz>k) split(t[x].lson,t[y].lson,k);
else if(t[t[x].lson].sz<k) split(t[x].rson,t[y].rson,k-t[t[x].lson].sz);
t[y].sz=t[x].sz-k;
t[x].sz=k;
}
signed main()
{
cin>>n>>m;
rt[1]=1;
cnt=tot=1;
for(int i=1;i<=n;++i)
{
cin>>v;
add(1,1,n,i,v);
}
for(int i=1;i<=m;++i)
{
cin>>opt;
if(opt==0)
{
cin>>xx>>p>>q;
num=ask(rt[xx],1,n,1,p-1),num2=ask(rt[xx],1,n,1,q);
split(rt[xx],rt[++tot],num);
split(rt[tot],tmp,num2-num);
rt[xx]=merge(rt[xx],tmp);
}
else if(opt==1)
{
cin>>p>>q;
rt[p]=merge(rt[p],rt[q]);
}
else if(opt==2)
{
cin>>p>>xx>>q;
add(rt[p],1,n,q,xx);
}
else if(opt==3)
{
cin>>xx>>p>>q;
cout<<ask(rt[xx],1,n,p,q)<<endl;
}
else
{
cin>>p>>q;
if(t[rt[p]].sz<q || q<1) cout<<-1<<endl;
else cout<<kth(rt[p],1,n,q)<<endl;
}
}
return 0;
}