看样子,应该有比较好的做法,不过,这道题,肯定要上主席树辣!!

如果打算用主席树做这道题的话,这道题就是一个主席树的纯板子问题了。。。

相当于查询区间l-r中1-x的数字的个数

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
struct node{
    int lson,rson,w;
}t[N<<5];
int rt[N],cnt;
inline void insert(int &now,int pas,int l,int r,int x){
    now=++cnt;
    t[now]=t[pas];
    ++t[now].w;
    if(l==r){
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid){
        insert(t[now].lson,t[pas].lson,l,mid,x);
    }else{
        insert(t[now].rson,t[pas].rson,mid+1,r,x);
    }
}
inline int find(int now,int pas,int l,int r,int lc,int rc){
    if(lc<=l&&r<=rc){
        return t[now].w-t[pas].w;
    }
    int mid=(l+r)>>1,res=0;
    if(lc<=mid){
        res+=find(t[now].lson,t[pas].lson,l,mid,lc,rc);
    }
    if(rc>mid){
        res+=find(t[now].rson,t[pas].rson,mid+1,r,lc,rc);
    }
    return res;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        int x;
        scanf("%d",&x);
        insert(rt[i],rt[i-1],1,1e5,x);
    }
    while(m--){
        int l,r,x;
        scanf("%d%d%d",&l,&r,&x);
        printf("%d\n",find(rt[r],rt[l-1],1,1e5,1,x));
    }
    return 0;
}