第一场多校

#include <bits/stdc++.h>
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pb push_back
#define MP make_pair
#define FIN freopen("in.txt","r",stdin)
#define fuck(x) cout<<"["<<x<<"]"<<endl
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int mod=1e9+7;
const int MX=1e5+7;

int n,m;
int a[MX],pos[MX];
int num[MX],res;
struct que{
    int l,r,id;
    int ans;
}q[MX];
bool cmp(que a,que b){
    if(pos[a.l]!=pos[b.l]) return a.l<b.l;
    return a.r<b.r;
}
void add(int x){
    res+=num[x]==0?1:0;
    num[x]++;
}
void del(int x){
    num[x]--;
    res-=num[x]==0?1:0;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        memset(num,0,sizeof(num));
        res=0;
        int block=(int)sqrt(n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            pos[i]=(i-1)ock;
        }
        for(int i=1;i<=m;i++){
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].id=i;
        }
        sort(q+1,q+m+1,cmp);
        int l=0,r=n+1;
        for(int i=1;i<=m;i++){
            while(r>q[i].r) add(a[--r]);
            while(r<q[i].r) del(a[r++]);
            while(l<q[i].l) add(a[++l]);
            while(l>q[i].l) del(a[l--]);
            q[q[i].id].ans=res;
        }
        for(int i=1;i<=m;i++)
            printf("%d\n",q[i].ans);
    }
    return 0;
}

posted @ 2018-08-07 23:02  Cwolf9  阅读(142)  评论(0)    收藏  举报