mxqz 90pts TLE on #11
查看原帖
mxqz 90pts TLE on #11
206763
PtrZ楼主2022/7/6 18:24
#include<bits/stdc++.h>
#define int long long
#define maxn 200020
using namespace std;
int n,m;
int rt[maxn<<5],l[maxn<<5],r[maxn<<5],sum[maxn<<5],cnt,d;
stack<int> s;
inline void pushup(int x) {
	sum[x]=sum[l[x]]+sum[r[x]];
	return ;
}
inline void del(int p) {
	s.push(p);
	sum[p]=l[p]=r[p]=0;
	return ;
}
inline int input() {
	if(!s.empty()) {
		int t=s.top();
		s.pop();
		return t;
	}
	return ++cnt;
}
int query(int p,int x,int y,int L,int R) {
	if (!p) return 0;
	if (y<L&&R<x) return 0;
	if (L<=x&&y<=R) return sum[p];
	int mid=x+y>>1;
	return query(l[p],x,mid,L,R)+query(r[p],mid+1,y,L,R);
}
int query(int p,int x,int y,int k) {
	if(!p||k<=0) return -1;
	if(x==y) {
		if(sum[p]>=k) return x;
		return -1;
	}
	int mid=x+y>>1;
	if(l[p]&&sum[l[p]]>=k) return query(l[p],x,mid,k);
	else if(r[p]) return  query(r[p],mid+1,y,k-sum[l[p]]);
	return -1;
}
void modify(int &p,int L,int R,int x,int v) {
	if(!p) p=input();
	if(L==R) {
		sum[p]+=v;
		return ;
	}
	int mid=L+R>>1;
	if(x<=mid) modify(l[p],L,mid,x,v);
	else modify(r[p],mid+1,R,x,v);
	pushup(p);
	return ;
}
void split(int a,int &b,int k) {
	if(!a) return ;
	b=input();
	int cnt=sum[l[a]];
	if(k>cnt) {
		split(r[a],r[b],k-cnt);
	} else {
		swap(r[a],r[b]);
	}
	if(k<cnt) split(l[a],l[b],k);
	sum[b]=sum[a]-k;
	sum[a]=k;
	return ;
}
int merge(int a,int b,int L,int R) {
	if(!b) return a;
	if(!a) return b;
	if(L==R) {
		sum[a]+=sum[b];
		del(b);
		return a;
	}
	int mid=L+R>>1;
	l[a]=merge(l[a],l[b],L,mid);
	r[a]=merge(r[a],r[b],mid+1,R);
	pushup(a);
	del(b);
	return a;
}
signed main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	rt[d=1]=++cnt;
	for(int i=1;i<=n;i++){
		int num;
		cin>>num;
		modify(rt[1],1,n,i,num);
	}
	while(m--) {
		int op;
		cin>>op;
		if(op==0) {
			int p,x,y;
			cin>>p>>x>>y;
			int t1=query(rt[p],1,n,1,y);
			int t2=query(rt[p],1,n,x,y);
			split(rt[p],rt[++d],t1-t2);
			int tmp=0;
			split(rt[d],tmp,t2);
			rt[p]=merge(rt[p],tmp,1,n);
		}
		if(op==1) {
			int p,t;
			cin>>p>>t;
			rt[p]=merge(rt[p],rt[t],1,n);
		}
		if(op==2) {
			int p,x,q;
			cin>>p>>x>>q;
			modify(rt[p], 1, n, q, x);
		}
		if(op==3) {
			int p,x,y;
			cin>>p>>x>>y;
			cout<<query(rt[p],1,n,x,y)<<'\n';
		}
		if(op==4) {
			int p,k;
			cin>>p>>k;
			cout<<query(rt[p],1,n,k)<<'\n';
		}
	}
	return 0;
}
2022/7/6 18:24
加载中...