MLE90pts求助
查看原帖
MLE90pts求助
225484
Kent999楼主2024/1/16 12:07

rt

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid (l+r>>1)
#define lson tr[rt].ls
#define rson tr[rt].rs
#define ls1 tr[rt1].ls
#define rs1 tr[rt1].rs
#define ls2 tr[rt2].ls
#define rs2 tr[rt2].rs
const int M=200000;
int n,m,a[200005];
struct tree{
	int ls,rs;
	ll cnt;
}tr[8000005];
int rot[200005]={0,1},tot=1,sum=1;
void push_up(int rt){
	tr[rt].cnt=tr[lson].cnt+tr[rson].cnt; 
}
void build(int rt,int l,int r){
	if(l==r){
		tr[rt].cnt=a[l];
		return;
	}
	lson=++tot;rson=++tot;
	build(lson,l,mid);build(rson,mid+1,r);
	push_up(rt);
}
void update(int rt,int l,int r,int q,int k){
	if(l==q && q==r){
		tr[rt].cnt+=k;
		return ;
	}
	if(q<=mid){
		if(!lson)lson=++tot;
		update(lson,l,mid,q,k);
	}else{
		if(!rson)rson=++tot;
		update(rson,mid+1,r,q,k);
	}
	push_up(rt);
}
ll query(int rt,int l,int r,int ql,int qr){
//	printf("id=%d in[%d,%d] ask for[%d,%d]\n",rt,l,r,ql,qr);
	if(ql<=l && qr>=r)return tr[rt].cnt;
	ll res=0;
	if(ql<=mid && lson)res+=query(lson,l,mid,ql,qr);
	if(qr>mid && rson)res+=query(rson,mid+1,r,ql,qr);
	return res;
}
int query_kth(int rt,int l,int r,ll k){
	if(l==r)return l;
	if(lson && tr[lson].cnt>=k)return query_kth(lson,l,mid,k);
	else return query_kth(rson,mid+1,r,k-tr[lson].cnt);
}
void merge(int rt1,int rt2,int l,int r){
	if(l==r){
		tr[rt1].cnt+=tr[rt2].cnt;
		return ;
	}
	if(ls1 && ls2)merge(ls1,ls2,l,mid);
	else if(ls2)ls1=ls2;
	if(rs1 && rs2)merge(rs1,rs2,mid+1,r);
	else if(rs2)rs1=rs2;
	push_up(rt1);
}
void split(int rt1,int rt2,ll k){
	ll v=tr[ls1].cnt;
	if(k<v){
		swap(rs1,rs2);
		if(!ls2)ls2=++tot;
		split(ls1,ls2,k);
	}else if(k==v){
		swap(rs1,rs2);
	}else{
		if(!rs2)rs2=++tot;
		split(rs1,rs2,k-v);
	}
	push_up(rt1);push_up(rt2);
}
int main(){
//	freopen("split.in","r",stdin);
//	freopen("split.ans","w",stdout); 
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,M);
	for(int i=1;i<=m;i++){
		int op;scanf("%d",&op);
		if(op==0){
//			puts("Case1");
			int p,x,y;scanf("%d%d%d",&p,&x,&y);
			int q=++sum;rot[q]=++tot;
			ll sum1=query(rot[p],1,M,1,x-1),sum2=query(rot[p],1,M,1,y);
			split(rot[p],rot[q],sum1);
			int r=++tot;
			split(rot[q],r,sum2-sum1);
			merge(rot[p],r,1,M);
		}else if(op==1){
//			puts("Case2");
			int p,t;scanf("%d%d",&p,&t);
			merge(rot[p],rot[t],1,M);
		}else if(op==2){
//			puts("Case3");
			int p,x,q;scanf("%d%d%d",&p,&x,&q);
			update(rot[p],1,M,q,x);
		}else if(op==3){
//			puts("Case4");
			int p,x,y;scanf("%d%d%d",&p,&x,&y);
			printf("%lld\n",query(rot[p],1,M,x,y));
		}else{
//			puts("Case5");
			int p,k;scanf("%d%d",&p,&k);
			if(tr[rot[p]].cnt<k)puts("-1");
			else printf("%d\n",query_kth(rot[p],1,M,k));
		}
//		printf("abababa\n");
	}
	return 0;
}
2024/1/16 12:07
加载中...