球球了qwq
const int MAXN=1e6+10;
int N,Q;
struct SegmentTree
{
int Rt[MAXN],Idx=0,Coll=1;
struct ST
{
int lc,rc;
int val;
}Tr[MAXN<<5];
int merge(int p1,int p2,int l,int r)
{
if(!p1||!p2) return p1|p2;
Tr[p1].val+=Tr[p2].val;
if(l==r) return p1;
int mid=(l+r)>>1;
Tr[p1].lc=merge(Tr[p1].lc,Tr[p2].lc,l,mid),
Tr[p1].rc=merge(Tr[p1].rc,Tr[p2].rc,mid+1,r);
return p1;
}
void split(int p1,int &p2,int k)
{
if(!p1) return ;
p2=++Idx;
int v=Tr[Tr[p1].lc].val;
if(v<k) split(Tr[p1].rc,Tr[p2].rc,k-v);
else std::swap(Tr[p1].rc,Tr[p2].rc);
if(v>k) split(Tr[p1].lc,Tr[p2].lc,k);
Tr[p2].val=Tr[p1].val-k,Tr[p1].val=k;
}
void modifyX(int &p,int l,int r,int v,int k)
{
if(!p) p=++Idx;
Tr[p].val+=k;
if(l==r) return ;
int mid=(l+r)>>1;
if(v<=mid) modifyX(Tr[p].lc,l,mid,v,k);
else modifyX(Tr[p].rc,mid+1,r,v,k);
}
int queryCnt(int p,int l,int r,int ql,int qr)
{
if(!p) return 0ll;
if(ql<=l&&r<=qr) return Tr[p].val;
int mid=(l+r)>>1;
int res=0;
if(ql<=mid) res+=queryCnt(Tr[p].lc,l,mid,ql,qr);
if(mid<qr) res+=queryCnt(Tr[p].rc,mid+1,r,ql,qr);
return res;
}
int queryKth(int p,int l,int r,int k)
{
if(l==r) return l;
int mid=(l+r)>>1;
if(Tr[Tr[p].lc].val>=k) return queryKth(Tr[p].lc,l,mid,k);
else return queryKth(Tr[p].rc,mid+1,r,k-Tr[Tr[p].lc].val);
}
inline void move()
{
int p,x,y;read(p,x,y);
int q1=queryCnt(Rt[p],1,N,1,y),q2=queryCnt(Rt[p],1,N,x,y);
split(Rt[p],Rt[++Coll],q1-q2);
split(Rt[Coll],Rt[0],q2);
Rt[x]=merge(Rt[x],Rt[0],1,N);
}
inline void merge()
{
int p,t;read(p,t);
Rt[p]=merge(Rt[p],Rt[t],1,N);
}
inline void modifyX()
{
int x,p;int q;
read(p,x,q);
modifyX(Rt[p],1,N,q,x);
}
inline int queryCnt()
{
int p,x,y;read(p,x,y);
return queryCnt(Rt[p],1,N,x,y);
}
inline int queryKth()
{
int p;int k;
read(p,k);
int cnt=queryCnt(Rt[p],1,N,1,N);
if(cnt<k) return -1;
return queryKth(Rt[p],1,N,k);
}
inline void insert(int x,int v)
{
modifyX(Rt[1],1,N,x,v);
}
}Tree;
signed main()
{
freopen("P5494_1.in","r",stdin);
freopen("P5494.out","w",stdout);
read(N,Q);
for(int i=1,x;i<=N;++i) read(x),Tree.insert(i,x);
for(int opt;Q--;)
{
read(opt);
switch(opt)
{
case 0:Tree.move();break;
case 1:Tree.merge();break;
case 2:Tree.modifyX();break;
case 3:write(Tree.queryCnt(),'\n');break;
case 4:write(Tree.queryKth(),'\n');break;
}
}
return 0;
}
真 Mn Zn ,码风有些清奇,谢谢各位巨佬惹