什么数据啊!!
查看原帖
什么数据啊!!
290959
聊机楼主2021/4/28 22:22

RT,第11个点改了半天,一直过不去,刚开始我没有回收利用,所以我猜是数组越界了,后来回收了,要不WA要不就是依旧RE……我真服了(神犇们快救救这个蒟蒻吧)!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int IN(ll &k){
	k=0;char ch=getchar();
	while(!isdigit(ch)){ch=getchar();}
	while(isdigit(ch)){k=(k<<1)+(k<<3)+(ch^48);ch=getchar();}
}
const int N=2e5+2;
ll n,mx,m,a[N];
struct SegmentTree{
	int l,r;ll s;
	#define l(x) t[x].l
	#define r(x) t[x].r
	#define s(x) t[x].s
}t[N<<5];
int root[N],tot;
int bac[N<<5],ct;
inline void Del(int k){
	l(k)=r(k)=s(k)=0;
	bac[++ct]=k;
}
inline int NewNode(){
	if(ct) return bac[ct--];
	return ++tot;
}
void build(int &p,int l,int r)
{
	if(!p) p=NewNode();
	s(p)=a[r]-a[l-1];
	if(l==r) return ;
	int mid=l+r>>1;
	if(a[mid]-a[l-1]) build(l(p),l,mid);
	if(a[r]-a[mid]) build(r(p),mid+1,r);
}
void insert(int &p,int l,int r,int val,int cnt){
	if(!p) p=NewNode();
	s(p)+=cnt;
	if(l==r) return ;
	int mid=l+r>>1;
	if(val<=mid) insert(l(p),l,mid,val,cnt);
	else insert(r(p),mid+1,r,val,cnt);
}
void split(int &p,int &k,int l,int r,int L,int R){
	if(!s(k)) return ;
	if(l>=L&&r<=R){
		p=k;k=0;return ;
	}
	if(!p) p=NewNode();
	int mid=l+r>>1;
	if(mid>=L) split(l(p),l(k),l,mid,L,R);
	if(mid<R) split(r(p),r(k),mid+1,r,L,R);
	s(p)=s(l(p))+s(r(p));s(k)=s(l(k))+s(r(k));
}
void merge(int &p,int k,int l,int r){
	if(!s(k)) return ;
	if(!p) p=NewNode();
	s(p)+=s(k);
	if(l==r) return ;
	int mid=l+r>>1;
	merge(l(p),l(k),l,mid);
	merge(r(p),r(k),mid+1,r);
	Del(k);
}
ll ask(int p,int l,int r,int L,int R){
	if(!p) return 0;
	if(l>=L&&r<=R) return s(p);
	ll anx=0;int mid=l+r>>1;
	if(mid>=L) anx+=ask(l(p),l,mid,L,R);
	if(mid<R) anx+=ask(r(p),mid+1,r,L,R);
	return anx;
}
int Ask(int p,int l,int r,int k){
	if(!p||k>s(p)) return -1;
	if(l==r) return l;
	int mid=l+r>>1;
	if(s(l(p))>=k) return Ask(l(p),l,mid,k);
	else return Ask(r(p),mid+1,r,k-s(l(p)));
}
void print(ll x){
	if(x<0) putchar('-'),x=~x+1;
	if(x>9) print(x/10);putchar(x%10+48);
}
inline void Pt(ll x){
	print(x);putchar('\n');
}
void put(int p,int l,int r){
	printf("%d %d %d %d %d %d\n",p,l,r,l(p),r(p),s(p));
	int mid=l+r>>1;if(l==r) return ;
	put(l(p),l,mid);put(r(p),mid+1,r);
}
int cnt=1;ll g;
int main(){
//	freopen("data.out","w",stdout);
	IN(n);IN(m);
	for(int i=1;i<=n;i++)
	    IN(g),a[i]=a[i-1]+g;
	build(root[1],1,n);
	while(m--)
	{
		ll opt,p,x,y,q,t,k;IN(opt),IN(p);
		switch(opt) {
			case 0:  IN(x),IN(y);split(root[++cnt],root[p],1,n,x,y);break;
			case 1:  IN(t);merge(root[p],root[t],1,n);break;
			case 2:  IN(x),IN(q);insert(root[p],1,n,q,x);break;
			case 3:  IN(x),IN(y);Pt(ask(root[p],1,n,x,y));break;
			case 4:  IN(k);Pt(Ask(root[p],1,n,k));break;
		}
//		printf("/*\n");put(root[1],1,n);printf("*/\n");
	}
	return 0;
}
2021/4/28 22:22
加载中...