【模板】莫队

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;//区间范围 
const int MAX=1e6+5;//最大数字 
int unit,cnt[MAX],arr[N],res[N],ans=0;
struct node{
    int l,r,id;
}q[N];
bool cmp(node a,node b){
    return a.l/unit!=b.l/unit?a.l/unit<b.l/unit:a.r<b.r;
}
void add(int pos){
    cnt[arr[pos]]++;
    if(cnt[arr[pos]]==1){
        ans++;
    }
}
void remove(int pos){
    cnt[arr[pos]]--;
    if(cnt[arr[pos]]==0){
        ans--;
    }
}
int main(){
    int n;
    scanf("%d",&n);
    unit=sqrt(n);
    for(int i=1;i<=n;i++){
        scanf("%d",&arr[i]);
    }    
    int m;
    scanf("%d",&m);
    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=q[1].l,R=L-1;
    for(int i=1;i<=m;i++){
        while(L>q[i].l)
            add(--L);
        while(L<q[i].l)
            remove(L++);
        while(R>q[i].r)
            remove(R--);
        while(R<q[i].r)
            add(++R);
        res[q[i].id]=ans;
    }
    for(int i=1;i<=m;i++){
        printf("%d\n",res[i]);
    }
}

 

posted @ 2019-07-02 18:36  Dorom  阅读(137)  评论(0)    收藏  举报