线段树太毒瘤了,这起码调了一个月
有人能康康吗/kel
#include<algorithm>
#include<cstdio>
const int M=5e4+5;
typedef long long ll;
struct Node{
int L,R;
ll val,lazy;
}t[M*200];
int n,m,tot,len,lsh[M],root[M<<2];
struct ASK{
int opt,L,R;
ll val;
}q[M];
inline int min(const int&a,const int&b){
return a>b?b:a;
}
inline int max(const int&a,const int&b){
return a>b?a:b;
}
void change(int&u,int l,int r,int L=1,int R=n){
if(L>r||R<l)return;
if(!u)u=++tot;
t[u].val+=min(R,r)-max(L,l)+1;
if(l<=L&&r>=R)return void(++t[u].lazy);
if(L<R){
int mid=L+R>>1;
change(t[u].L,l,r,L,mid);
change(t[u].R,l,r,mid+1,R);
}
}
ll query(int u,int l,int r,int L=1,int R=n,ll add=0){
if(L>r||R<l)return 0;
if(!u)return add*(R-L+1);
if(l<=L&&r>=R)return t[u].val+add*(R-L+1);
if(L<R){
int mid=L+R>>1;
return query(t[u].L,l,r,L,mid,add+t[u].lazy)+query(t[u].R,l,r,mid+1,R,add+t[u].lazy);
}
}
void Change(int u,int l,int r,int x,int L=1,int R=len){
change(root[u],l,r);
if(L<R){
int mid=L+R>>1;
if(x<=mid)Change(u<<1,l,r,x,L,mid);
else Change(u<<1|1,l,r,x,mid+1,R);
}
}
int Query(int u,int l,int r,ll k,int L=1,int R=len){
if(L==R)return L;
ll sum=query(root[u<<1|1],l,r);
int mid=L+R>>1;
if(k>sum)return Query(u<<1,l,r,k-sum,L,mid);
else return Query(u<<1|1,l,r,k,mid+1,R);
}
signed main(){
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i){
scanf("%d%d%d%lld",&q[i].opt,&q[i].L,&q[i].R,&q[i].val);
if(q[i].opt==1)lsh[++len]=q[i].val;
}
std::sort(lsh+1,lsh+len+1);
len=std::unique(lsh+1,lsh+len+1)-lsh-1;
for(i=1;i<=m;++i){
if(q[i].opt==1){
q[i].val=std::lower_bound(lsh+1,lsh+len+1,q[i].val)-lsh;
Change(1,q[i].L,q[i].R,q[i].val);
}
else{
printf("%d\n",lsh[Query(1,q[i].L,q[i].R,q[i].val)]);
}
}
}