MnZn求助树套树,一直输出-1怎么办
查看原帖
MnZn求助树套树,一直输出-1怎么办
340663
YLiF4楼主2022/8/19 11:48
#include<cstdio>
const int maxn=50010;
int n,m;
namespace segt1{
	struct node{
		int ls,rs,l,r;
		long long cnt,la;
		node(){ls=rs=cnt=0;}
	}t[maxn<<7];
	int tp;
	void pushup(int k){
		t[k].cnt=0;
		if(t[k].ls){
			t[k].cnt+=t[t[k].ls].cnt;
		}
		if(t[k].rs){
			t[k].cnt+=t[t[k].rs].cnt;
		}
	}
	void pushdown(int k){
		const int mid=(t[k].l+t[k].r)>>1;
		//printf("pd k=%d l=%d r=%d ls=%d rs=%d\n",k,t[k].l,t[k].r,t[k].ls,t[k].rs);
		if(!t[k].ls){
			t[k].ls=++tp;
			t[t[k].ls].l=t[k].l;
			t[t[k].ls].r=mid;
			//printf("new ls=%d l=%d r=%d\n",t[k].ls,t[t[k].ls].l,t[t[k].ls].r);
		}
		if(!t[k].rs){
			t[k].rs=++tp;
			t[t[k].rs].r=t[k].r;
			t[t[k].rs].l=mid+1;
			//printf("new rs=%d l=%d r=%d\n",t[k].rs,t[t[k].rs].l,t[t[k].rs].r);
		}
		t[t[k].ls].cnt+=t[k].la*(t[t[k].ls].r-t[t[k].ls].l+1);
		t[t[k].rs].cnt+=t[k].la*(t[t[k].rs].r-t[t[k].rs].l+1);
		t[t[k].ls].la+=t[k].la;
		t[t[k].rs].la+=t[k].la;
		t[k].la=0;
	}
	void update(int l,int r,int& k,int L=1,int R=n){
		if(!k){
			k=++tp;t[k].l=L,t[k].r=R;
		}
		//printf("up l=%d r=%d v=%d L=%d R=%d k=%d\n",l,r,v,L,R,k);
		if(l<=L&&r>=R){
			t[k].cnt+=(t[k].r-t[k].l+1);
			t[k].la++;
			return;
		}
		pushdown(k);
		const int mid=(L+R)>>1;
		if(l>mid){
			update(l,r,t[k].rs,mid+1,R);
		}else if(r<=mid){
			update(l,r,t[k].ls,L,mid);
		}else{
			update(l,r,t[k].rs,mid+1,R);
			update(l,r,t[k].ls,L,mid);
		}
		pushup(k);
	}
	long long query(int l,int r,int k,int L=1,int R=n){
		//printf("qu l=%d r=%d k=%d L=%d R=%d cnt=%lld ls=%d rs=%d\n",l,r,k,L,R,t[k].cnt,t[k].ls,t[k].rs);
		if(l>R||r<L||!k){
			return 0;
		}
		if(l<=L&&r>=R){
			//puts("A");
			return t[k].cnt;
		}
		pushdown(k);
		//printf("k=%d ls=%d rs=%d\n",k,t[k].ls,t[k].rs);
		const int mid=(L+R)>>1;
		long long ans=query(l,r,t[k].ls,L,mid)+query(l,r,t[k].rs,mid+1,R);
		//printf("ans=%lld\n",ans);
		return ans;
	}
}
namespace segt2{
	struct node{
		int rt,ls,rs;
		node(){rt=ls=rs=0;}
	}t[maxn<<5];
	int tp=0,rt;
	void update(int p,int l,int r,int& k=rt,int L=1,int R=n){
		if(!k){
			k=++tp;
		}
		if(p>R||p<L){
			return;
		}
		//printf("u p=%d v=%d l=%d r=%d L=%d R=%d k=%d\n",p,v,l,r,L,R,k);
		segt1::update(l,r,t[k].rt);
		if(L==R){
			return;
		}else{
			const int mid=(L+R)>>1;
			update(p,l,r,t[k].ls,L,mid);
			update(p,l,r,t[k].rs,mid+1,R);
		}
	}
	int query(long long rnk,int l,int r,int&k=rt,int L=1,int R=n){
		if(!k){
			k=++tp;
			t[k].rt=++segt1::tp;
		}
		//printf("q rnk=%lld l=%d r=%d L=%d R=%d k=%d\n",rnk,l,r,L,R,k);
		if(rnk>segt1::query(l,r,t[k].rt)){
			return -1;
		}
		if(L==R){
			return L;
		}
		const int mid=(L+R)>>1;
		int lrnk=segt1::query(l,r,t[t[k].rs].rt);
		if(rnk>lrnk){
			return query(rnk-lrnk,l,r,t[k].ls,L,mid);
		}else{
			return query(rnk,l,r,t[k].rs,mid+1,R);
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int op,l,r,c;
		scanf("%d%d%d%d",&op,&l,&r,&c);
		if(op==1){
			segt2::update(c,1,l,r);
		}else{
			printf("%d\n",segt2::query(c,l,r));
		}
	}
	return 0;
}
2022/8/19 11:48
加载中...