莫队模版题
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<set> #include<map> #include<stack> #include<cstring> #pragma GCC optimize(2) #define inf 2147483647 #define ls rt<<1 #define rs rt<<1|1 #define lson ls,nl,mid,l,r #define rson rs,mid+1,nr,l,r #define N 1000010 #define For(i,a,b) for(register int i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() using namespace std; int a[N],cnt[N],b[N],l,r,ql,qr; int n,m,size,num,now,ans[N]; struct query{ int l,r,id; }q[N]; inline bool cmp(query x,query 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; } void in(int &x){ int y=1; char c=g();x=0; while(c<'0'||c>'9'){ if(c=='-')y=-1; c=g(); } while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=g(); } x*=y; } void o(int x){ if(x<0){ p('-'); x=-x; } if(x>9)o(x/10); p(x%10+'0'); } int main(){ in(n); size=sqrt(n); num=ceil((double)n/size); For(i,1,num) For(j,(i-1)*size+1,i*size) b[j]=i; For(i,1,n) in(a[i]); in(m); For(i,1,m){ in(q[i].l);in(q[i].r); q[i].id=i; } sort(q+1,q+m+1,cmp); l=1;r=0; For(i,1,m){ ql=q[i].l;qr=q[i].r; while(l<ql) now-=!--cnt[a[l++]]; while(l>ql) now+=!cnt[a[--l]]++; while(r<qr) now+=!cnt[a[++r]]++; while(r>qr) now-=!--cnt[a[r--]]; ans[q[i].id]=now; } For(i,1,m) o(ans[i]),p(' '); return 0; }