本地数据都过了,一交全RE……
本来复键想练练手,没想到一上来就把心态练崩了
#include <bits/stdc++.h>
using namespace std;
#define rep(a,b,c) for(int a=b;a<=c;a++)
const int N=2e6+5;int n;
int read()
{
char c;int f=1,ret=0;c=getchar();
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
return ret*f;
}
struct note
{
int l,r;int loc;
};
note q[N];
int las[N];
int lowbit(int x){return x&(-x);}
int t[N<<1];
int query(int loc)
{
int ret=0;
while(loc){ret+=t[loc];loc-=lowbit(loc);}
return ret;
}
int add(int loc,int rul)
{
while(loc<=n){t[loc]+=rul;loc+=lowbit(loc);}
}
int ans[N];
bool cmp(note a,note b){return a.r<b.r;}int a[N];
int main()
{
// freopen("P1972_1.in","r",stdin);
// freopen("out.out","w",stdout);
cin>>n;
int m;rep(i,1,n) a[i]=read();
cin>>m;
rep(i,1,m){q[i].l=read();q[i].r=read();q[i].loc=i;}
sort(q+1,q+1+m,cmp);
int top=1;
rep(i,1,n)
{
//cout<<i<<endl;
add(las[a[i]]+1,1);add(i+1,-1);las[a[i]]=i;//rep(j,1,i)
//cout<<query(j)<<" ";cout<<endl;
while(q[top].r==i)
{
ans[q[top].loc]=query(q[top].l);top++;
}
}
rep(i,1,m) cout<<ans[i]<<"\n";
return 0;
}