这是一篇整体二分的代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define lint long long
#define inl inline
inl lint read(){
lint x=0;int f=1;char c=getchar();
while(c<'0' or c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' and c<='9'){x=(x<<3)+(x<<1)+c-48;c=getchar();}
return x*f;
}
const int N=5e4+5,M=N*2,INF=1e9+7;
int n,m;
struct tree{
int l,r,len;
lint siz,upd;
}t[N*4];
struct node{
int l,r,opt;
lint k;
}Q[M],LE[M],RI[M];
inl void push_up(int u){
t[u].siz=t[u<<1].siz+t[u<<1|1].siz;
return ;
}
inl void push_down(int u){
if(!t[u].upd) return ;
t[u<<1].siz+=t[u<<1].len*t[u].upd;
t[u<<1].upd+=t[u].upd;
t[u<<1|1].siz+=t[u<<1|1].len*t[u].upd;
t[u<<1|1].upd+=t[u].upd;
t[u].upd=0;
return ;
}
inl void build(int u,int l,int r){
t[u].l=l,t[u].r=r,t[u].len=r-l+1;
if(l==r) return ;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
return ;
}
inl void update(int u,int l,int r,int val){
if(l<=t[u].l and t[u].r<=r){
t[u].siz+=t[u].len*val*1ll;
t[u].upd+=val;
return ;
}
push_down(u);
int mid=t[u].l+t[u].r>>1;
if(l<=mid) update(u<<1,l,r,val);
if(r>mid) update(u<<1|1,l,r,val);
push_up(u);
return ;
}
inl lint query(int u,int l,int r){
lint res=0;
if(l<=t[u].l and t[u].r<=r){
res+=t[u].siz;
return res;
}
push_down(u);
int mid=t[u].l+t[u].r>>1;
if(l<=mid) res+=query(u<<1,l,r);
if(r>mid) res+=query(u<<1|1,l,r);
// push_up(u);
return res;
}
int ans[N];
inl void solve(int l,int r,int L,int R){
if(l>r or L>R) return ;
if(l==r){
for(int i=L;i<=R;++i) if(Q[i].opt) ans[Q[i].opt]=l;
return ;
}
int mid=l+r>>1;
int cntl=0,cntr=0;
for(int i=L;i<=R;++i){
if(Q[i].opt){
lint V=query(1,Q[i].l,Q[i].r);
if(Q[i].k<=V){
RI[++cntr]=Q[i];
}
else{
Q[i].k-=V;
LE[++cntl]=Q[i];
}
}
else{
if(Q[i].k>=mid){
update(1,Q[i].l,Q[i].r,1);
RI[++cntr]=Q[i];
}
else{
LE[++cntl]=Q[i];
}
}
}
for(int i=1;i<=cntr;++i) if(!RI[i].opt) update(1,RI[i].l,RI[i].r,-1);
for(int i=1;i<=cntl;++i) Q[L+i-1]=LE[i];
for(int i=1;i<=cntr;++i) Q[L+i-1+cntl]=RI[i];
solve(l,mid,L,L+cntl-1),solve(mid+1,r,L+cntl,R);
return ;
}
int OO,HH;
int main(){
n=read(),m=read();
for(int i=1;i<=m;++i){
OO=read();
Q[i].l=read(),Q[i].r=read(),Q[i].k=read();
if(OO==1) Q[i].opt=0;
else Q[i].opt=++HH;
}
build(1,1,n);
solve(-INF,INF,1,m);
for(int i=1;i<=HH;++i){
printf("%d\n",ans[i]-1);
}
return 0;
}
注意看输出:
printf("%d\n",ans[i]-1);
:::align{center} -1 ::: 但是A了。不懂,求解答。