BZOJ1878
来自蒟蒻XXJ的做题记录
莫队随便水啊……
·吃瓜群众:不要听楼上的SB说话!他的代码在luogu上A掉了在bzoj RE了
#include<bits/stdc++.h>
using namespace std;
const int MAXK=1000100;
const int MAXN=50010;
const int MAXM=200010;
inline int in(){
int a(0);char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
return a;
}
int n,m;
int ans,num[MAXK];
int col[MAXN],al[MAXM],ar[MAXM],rk[MAXM],pos[MAXM],res[MAXM],siz;
bool cmp(int i,int j){
if(pos[i]==pos[j]) return ar[i]<ar[j];
return pos[i]<pos[j];
}
void update(int i,int on){
int c=col[i];
if(on==1){
if(!num[c]) ++ans;
++num[c];
}
else{
--num[c];
if(!num[c]) --ans;
}
}
void init(){
int u=rk[1];
for(int i=al[u];i<=ar[u];i++)
update(i,1);
res[u]=ans;
}
void input(){
n=in();siz=sqrt(n);
for(int i=1;i<=n;i++) col[i]=in();
m=in();
for(int i=1;i<=m;i++){
al[i]=in();ar[i]=in();
rk[i]=i;pos[i]=al[i]/siz;
}
sort(rk+1,rk+m+1,cmp);
init();
}
void xxj(){
int L=al[rk[1]],R=ar[rk[1]];
for(int i=2;i<=m;i++){
int u=rk[i];
for(;L<al[u];L++) update(L,-1);
for(;L>al[u];--L) update(L-1,1);
for(;R>ar[u];--R) update(R,-1);
for(;R<ar[u];++R) update(R+1,1);
res[u]=ans;
}
}
void output(){
for(int i=1;i<=m;i++) cout<<res[i]<<endl;
}
int main(){
input();
xxj();
output();
return 0;
}