?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
188400068 |
Practice: DaiRuiChen007 |
1520F2 - 9 | C++14 (GCC 6-32) | Accepted | 733 ms | 1768 KB | 2023-01-08 11:54:04 | 2023-01-08 11:54:04 |
// LUOGU_RID: 99038963 #include<bits/stdc++.h> #define int long long using namespace std; const int MAXN=2e5+1; inline int read(int l,int r) { cout<<"? "<<l<<" "<<r<<endl; int ret; cin>>ret; return ret; } int n,T,k; struct BitTree { int tree[MAXN]; inline int lowbit(int x) { return x&-x; } inline void update(int x,int v) { for(;x<=n;x+=lowbit(x)) tree[x]+=v; } inline void Modify(int l,int r,int v) { update(l,v); if(r<n) update(r+1,-v); } inline int Query(int x) { int ret=0; for(;x;x-=lowbit(x)) ret+=tree[x]; return ret; } } B; bool vis[MAXN]; inline int query(int x) { if(vis[x]) return B.Query(x); vis[x]=true; int p=read(1,x); B.Modify(x,x,p-B.Query(x)); return p; } inline bool check(int x) { return x-query(x)>=k; } signed main() { cin>>n>>T; while(T--) { cin>>k; int l=1,r=n,res=0; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) res=mid,r=mid-1; else l=mid+1; } B.Modify(res,n,1); cout<<"! "<<res<<endl; } return 0; }
?
?
?
?