检验了一下,不是回收栈的问题,也不是 long long 的问题,求大佬帮忙找一下问题。QAQ
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10,P=7.5e6;
int n,m,cnt,tot=1,root[N],stk[P],top,root1,root2;
struct tree {
int ls,rs;
ll siz;
} t[P];
int newnode() {
int id=top?stk[top--]:++cnt;
t[id]= {0,0,0};
return id;
}
void pushup(int rt) {
t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz;
}
void update(int &rt,int cur,int x,int l=1,int r=n) {
if(!rt)rt=newnode();
t[rt].siz+=x;
if(l==r)return;
int mid=(l+r)>>1;
cur<=mid?update(t[rt].ls,cur,x,l,mid):update(t[rt].rs,cur,x,mid+1,r);
}
ll query(int rt,int L,int R,int l=1,int r=n) {
if(!rt)return 0;
if(L<=l&&r<=R)return t[rt].siz;
int mid=(l+r)>>1;
ll s=0;
if(L<=mid)s+=query(t[rt].ls,L,R,l,mid);
if(mid<R)s+=query(t[rt].rs,L,R,mid+1,r);
return s;
}
int kth(int rt,ll k,int l=1,int r=n) {
if(k<1||k>t[rt].siz)return -1;
if(l==r)return l;
int mid=(l+r)>>1;
return k<=t[t[rt].ls].siz?kth(t[rt].ls,k,l,mid):kth(t[rt].rs,k-t[t[rt].ls].siz,mid+1,r);
}
void merge(int &x,int y) {
if(!x||!y)return void(x|=y);
stk[++top]=y;
merge(t[x].ls,t[y].ls);
merge(t[x].rs,t[y].rs);
pushup(x);
}
void split(int x,int &y,int cur,int l=1,int r=n) {
if(!x)return;
if(l==r)return;
y=newnode();
int mid=(l+r)>>1;
if(cur<=mid)swap(t[x].rs,t[y].rs),cur<mid&&(split(t[x].ls,t[y].ls,cur,l,mid),0);
else split(t[x].rs,t[y].rs,cur,mid+1,r);
pushup(x);
pushup(y);
}
void create(int p,int x,int y) {
if(x>1)split(root[p],root1,x-1);
else root1=root[p],root[p]=0;
if(y<n)split(root1,root2,y);
else root2=0;
merge(root[++tot],root1);
merge(root[p],root2);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1,x; i<=n; i++)scanf("%d",&x),update(root[1],i,x);
ll k;
for(int op,x,y,z; m--;) {
scanf("%d%d",&op,&x);
if(!op)scanf("%d%d",&y,&z),create(x,y,z);
else if(op==1)scanf("%d",&y),merge(root[x],root[y]);
else if(op==2)scanf("%d%d",&y,&z),update(root[x],z,y);
else if(op==3)scanf("%d%d",&y,&z),printf("%lld\n",query(root[x],y,z));
else scanf("%lld",&k),printf("%d\n",kth(root[x],k));
}
return 0;
}