开了O2,用了快读快写,和奇偶化排序
#include<bits/stdc++.h>
#define For(i,j,k) for(register int i=j;i<=k;i++)
#define dFor(i,j,k) for(register int i=j;i>=k;i--)
using namespace std;
#define size SiZe
int n,m,a[30010],ANS,cnt[1000010];
int size,block[30010];
int L=1,R,ans[200010];
struct Node{
int l,r,a,b,id;
bool operator<(const Node &node){
if(block[l]!=block[node.l]) return l<node.l;
else if(block[l]&1) return r<node.r;
else return r>node.r;
}
}q[200010];
inline int read(){
int k=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
return k;
}
inline void write(int x){
if(x<10) putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
signed main(){
n=read();
For(i,1,n) a[i]=read();
m=read();
For(i,1,m) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1);
size=n/sqrt(m);
For(i,1,n) block[i]=(i-1)/size+1;
For(i,1,m){
while(L>q[i].l) ANS+=!cnt[a[--L]]++;
while(R<q[i].r) ANS+=!cnt[a[++R]]++;
while(L<q[i].l) ANS-=!--cnt[a[L++]];
while(R>q[i].r) ANS-=!--cnt[a[R--]];
ans[q[i].id]=ANS;
}
For(i,1,m) write(ans[i]),putchar('\n');
return 0;
}