Title
Solution
注意使用位运算的优先级顺序
https://www.cnblogs.com/WAMonster/p/10118934.html
Code
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=1e6+5;
int n,m,b[N],a[N],s,num,cnt[N],val=0,ans[N];
struct node{
int l,r,id;
}q[N];
bool cmp(node x,node y){
return (b[x.l]^b[y.l])?b[x.l]<b[y.l]:((b[x.l]&1)?x.r<y.r:x.r>y.r);
}
int main(){
scanf("%d",&n);
s=(int)sqrt(n); num=ceil((double)n/s);
rep(i,1,num) rep(j,(i-1)*s+1,i*s) b[j]=i;
rep(i,1,n) scanf("%d",&a[i]);
scanf("%d",&m);
rep(i,1,m) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
rep(i,1,m){
int ql=q[i].l,qr=q[i].r;
while (l>ql) val+=!cnt[a[--l]]++;
while (l<ql) val-=!--cnt[a[l++]];
while (r>qr) val-=!--cnt[a[r--]];
while (r<qr) val+=!cnt[a[++r]]++;
ans[q[i].id]=val;
}
rep(i,1,m) printf("%d\n",ans[i]);
return 0;
}