树状数组之暂时不想注释


#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39145990/article/details/80055210