虽然马蜂不好,但悬赏 @ReTF 下的蛋一个。
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+100;
#define int long long
int n;
struct seg
{
#define mid ((l+r)>>1)
int cnt;
seg *l1=0,*r1=0;
seg(){cnt=0,l1=nullptr,r1=nullptr;}
seg(int x,int y){cnt=0,l1=nullptr,r1=nullptr;}
#define ll (l1!=nullptr?l1:l1=new seg(l,mid))
#define rr (r1!=nullptr?r1:r1=new seg(mid+1,r))
void insert(int l,int r,int &val,int num)
{
// if(r==0)assert(0);
// if(l==r)return;
// cout<<l<<' '<<r<<' '<<val<<' '<<num<<'\n';
if(l==r)
{
cnt+=num;
// cout<<ll<<'\n';
return;
}
// cout<<l<<' '<<r<<' '<<val<<' '<<num<<'\n';
cnt+=num;
if(val<=mid)
{
// ll;
// if(l1==nullptr)assert(0);
return ll->insert(l,mid,val,num);
}
else
{
// rr;
// if(rr==nullptr)assert(0);
return rr->insert(mid+1,r,val,num);
}
}
int find(int l,int r,int &val)
{
if(l==r)return cnt;
if(val>mid)if(ll)return ll->cnt+rr->find(mid+1,r,val);else if(rr)return rr->find(mid+1,r,val);else return 0;
if(ll)return ll->find(l,mid,val);
return 0;
}
#undef ll
#undef rr
};
struct t
{
signed l1,r1;
seg x,y;
}tr[N*4];
namespace sg
{
#define ll (tr[x].l1?tr[x].l1:tr[x].l1=++cnt,tr[tr[x].l1].x=seg(1,2*n+100),tr[tr[x].l1].y=seg(1,2*n+100),tr[x].l1)
#define rr (tr[x].r1?tr[x].r1:tr[x].r1=++cnt,tr[tr[x].r1].x=seg(1,2*n+100),tr[tr[x].r1].y=seg(1,2*n+100),tr[x].r1)
#define xx (tr[x])
int cnt=1;
// void build(int l,int r,int x)
// {
// // cout<<"A"<<x<<'\n';
// xx.x=seg(1,2*n+100);
// xx.y=seg(1,2*n+100);
// // cout<<xx.x.l<<' '<<xx.x.r<<'\n';
// if(l==r)return;
// ll=++cnt;
// rr=++cnt;
// build(l,mid,ll);
// build(mid+1,r,rr);
// // cout<<"C"<<tr[x].l1<<' '<<tr[x].r1<<'\n';
// }
void mod(int l1,int r1,int l,int r,int x,int val)
{
// cout<<"ST";
// cout<<"B"<<x<<'\n';
xx.y.insert(1,2*n+100,val,min(r1,r)-max(l,l1)+1);
if(l>=l1&&r<=r1)
{
// cout<<x<<' '<<val<<'\n';
xx.x.insert(1,2*n+100,val,1);
return;
}
// cout<<"A"<<x<<' '<<val<<'\n';
if(l==r)return;
if(l1<=mid)
{
mod(l1,r1,l,mid,ll,val);
}
if(r1>mid)
{
mod(l1,r1,mid+1,r,rr,val);
}
}
int rk(int l1,int r1,int l,int r,int x,int val)
{
if(l>=l1&&r<=r1)
{
return xx.y.find(1,2*n+100,val);
}
int res=xx.x.find(1,2*n+100,val)*(r1-l1+1);
if(l1<=mid)
{
res+=rk(l1,r1,l,mid,ll,val);
}
if(r1>mid)
{
res+=rk(l1,r1,mid+1,r,rr,val);
}
return res;
}
#undef mid
int find1(int l1,int r1,int k)
{
int l=1,r=2*n+15,mid,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
// cout<<"A"<<-mid+2*n+10<<' '<<rk(l1,r1,1,n,1,mid)<<'\n';
if(rk(l1,r1,1,n,1,mid)>=k)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
return -ans+n+10;
}
void insert(int l,int r,int val)
{
mod(l,r,1,n,1,-val+n+10);
}
}
using sg::find1;
using sg::insert;
int m;
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
// freopen("D:\\Backup\\Downloads\\P3332_4.in","r",stdin);
cin>>n>>m;
tr[1].x=seg(1,2*n+100);
tr[1].y=seg(1,2*n+100);
int op,l,r,c;
for(int i=1;i<=m;i++)
{
cin>>op>>l>>r>>c;
if(op&1)
{
insert(l,r,c);
}
else
{
cout<<find1(l,r,c)<<'\n';
}
}
}