求大佬调调
只有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;
}