查询第k个0 t 1e4
n 2e5,提问上限6e4
线段树保存改变影响
struct node{ int l,r,val;//0的个数 }tr[N<<2]; void build(int o,int l,int r){ tr[o].l=l,tr[o].r=r;tr[o].val=-1; if(l==r) return ; int mid=l+r>>1; build(o<<1,l,mid); build(o<<1|1,mid+1,r); } void change(int o,int k){ if(tr[o].val>0) --tr[o].val; if(tr[o].l==tr[o].r) return ; int mid=tr[o].l+tr[o].r>>1; if(mid<k) change(o<<1|1,k); else change(o<<1,k); } int query(int o){ if(tr[o].val==-1){ cout<<"? "<<tr[o].l<<" "<<tr[o].r<<endl; cin>>tr[o].val;tr[o].val=tr[o].r-tr[o].l+1-tr[o].val; } return tr[o].val; } void ask(int o,int k){ if(tr[o].l==tr[o].r){ cout<<"! "<<tr[o].l<<endl; change(1,tr[o].l); return ; } int mid=tr[o].l+tr[o].r>>1; int res=query(o<<1); if(res>=k) ask(o<<1,k); else ask(o<<1|1,k-res); } void solve(){ cin>>n>>t; build(1,1,n); while(t--){ cin>>m; ask(1,m); } }