#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
/*犯了一个很低级的错误。代码参考大佬*/
const int Kmax=1e5+10;
int n;
int sum[Kmax];
struct node{
int a,b,ord,res;
node(int _a,int _b,int _ord,int _res=0):
a(_a),b(_b),ord(_ord),res(_res){}
};
bool cmp(const node& a,const node& b){
return a.a<b.a;
}
bool cmp_back(const node& a,const node& b){
return a.ord<b.ord;
}
inline int lowbit(int x){
return x&-x;
}
void add(int x){
while (x<=n) {
sum[x]++;
x+=lowbit(x);
}
}
int getsum(int x){
int ans=0;
while (x) {
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
vector<node> table;
vector<int> v;
int main(){
int m;
int t;
scanf("%d%d",&n,&m);
v.push_back(0);
for(int i=0;i<n;i++){
scanf("%d",&t);
v.push_back(t);
}
int a,b,order=0;
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
table.push_back({a,b,order++});
}
sort(table.begin(),table.end(),cmp);
for(int i=1,p=0;p<m; p++){
while(i<=table[p].a){
add(v[i]);
i++;
}
table[p].res=getsum(table[p].b);
}
sort(table.begin(),table.end(),cmp_back);
for(int i=0;i<m;i++){
printf("%d\n",table[i].res);
}
return 0;
}
树状数组之暂时不想注释
最新推荐文章于 2022-07-07 12:14:40 发布