求调
查看原帖
求调
748723
wang_ly_ly楼主2024/3/13 17:14

求大佬调调

只有9分

https://www.luogu.com.cn/record/150662921

#include<iostream>
using namespace std;
struct A{
	long long o,l,r,c,id;
}a[50004],b[100][50004],c[50004];
long long cnt=1;
long long t[50004*4],o[50004*4];
long long n,m;
long long ans[50004];
void push_up(long long z){
	t[z]=t[z<<1]+t[z<<1|1];
}
void build(long long l,long long r,long long z){
	if(l==r){
		t[z]=0;
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,z<<1);
	build(mid+1,r,z<<1|1);
	push_up(z);
}
void push_down(long long l,long long r,long long z){
	if(o[z]){
		long long mid=(l+r)>>1;
		t[z<<1]+=o[z]*(mid-l+1);
		t[z<<1|1]+=o[z]*(r-mid);
		o[z<<1]+=o[z];
		o[z<<1|1]+=o[z];
		o[z]=0;
	}
}
void xiugai(long long l,long long r,long long x,long long y,long long z){
	if(l<=x&&y<=r){
		t[z]+=(y-x+1);
		o[z]++;
		return;
	}
	push_down(x,y,z);
	long long mid=(x+y)>>1;
	if(mid>=l)xiugai(l,r,x,mid,z<<1);
	if(mid<r)xiugai(l,r,mid+1,y,z<<1|1);
	push_up(z);
}
long long chaxun(long long l,long long r,long long x,long long y,long long z){
	if(l<=x&&y<=r){
		return t[z];
	}
	push_down(x,y,z);
	long long mid=(x+y)>>1;
	long long ans=0;
	if(mid>=l)ans+=chaxun(l,r,x,mid,z<<1);
	if(mid<r)ans+=chaxun(l,r,mid+1,y,z<<1|1);
//	push_up(z);
	return ans;
}
void erfen(long long l,long long r,long long len){
//	if(r>0)cout<<l<<" "<<r<<" "<<cnt<<"\n";
//	for(long long i=1;i<=len;i++){
//		cout<<b[cnt][i].o<<" "<<b[cnt][i].l<<" "<<b[cnt][i].r<<" "<<b[cnt][i].c<<" "<<b[cnt][i].id<<"\n";
//	}
//	cout<<"\n";
	if(l>r||!len){
	    cnt--;
	    return;
	}
	if(l==r){
		for(long long i=1;i<=len;i++)
			if(b[cnt][i].o==2)ans[b[cnt][i].id]=l;
		cnt--;
		return;
	}
	build(1,n,1);
	long long mid=(l+r)>>1;
	long long o=0;
	long long l_=0,r_=0;//左个数,右个数
	for(long long i=1;i<=len;i++){
		if(b[cnt][i].o==2){
			long long s=chaxun(b[cnt][i].l,b[cnt][i].r,1,n,1);
//			cout<<b[cnt][i].o<<" "<<b[cnt][i].l<<" "<<b[cnt][i].r<<" "<<b[cnt][i].c<<" "<<b[cnt][i].id<<"\n";
//			cout<<s<<"\n";
			if(s<b[cnt][i].c){
				c[++l_]=b[cnt][i];
				b[cnt][i].c-=s;
			}
			else b[cnt+1][++r_]=b[cnt][i];
		}
		else{
			if(b[cnt][i].c>mid){
				b[cnt+1][++r_]=b[cnt][i];
				xiugai(b[cnt][i].l,b[cnt][i].r,1,n,1);
			}
			else c[++l_]=b[cnt][i];
		}
	}
	for(long long i=1;i<=l_;i++){
		b[cnt][i]=c[i];
	}
//	cout<<"\n";
	cnt++;
	erfen(mid+1,r,r_);
	erfen(l,mid,l_);
}
int main(){
	cin>>n>>m;
	long long o=0;
	for(long long i=1;i<=m;i++){
		cin>>a[i].o>>a[i].l>>a[i].r>>a[i].c;
		if(a[i].o==2){
			o++;
			a[i].id=o;
		}
		b[1][i]=a[i];
	}
	erfen(-n,n,m);
	for(long long i=1;i<=o;i++)cout<<ans[i]<<"\n"; 
	return 0;
} 
2024/3/13 17:14
加载中...