树状数组二分完为啥需要change(r,1)??
#include <bits/stdc++.h>
using namespace std;
#define N 200005
int n,q,a[N],c[N],k[N];
int lowbit(int x) {
return x&(-x);
}
void change(int x,int k)
{
while(x<=n) {
c[x]+=k;
x+=lowbit(x);
}
}
int query(int x)
{
int sum=0;
while(x>0) {
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
signed main()
{
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {
int l=0,r=n+1;
while(l+1<r) {
int mid=l+r>>1;
int sum=query(mid);
if(sum/mid<a[i]) r=mid;
else l=mid;
}
k[i]=r;
change(r,1);
}
while(q--) {
int id,x; cin>>id>>x;
if(k[id]<=x) cout<<"YES\n";
else cout<<"NO\n";
}
}