按第一篇题解思路写的,样例已过,提交全WA,DE不出BUG了有没有神犇帮个忙啊
#include<bits/stdc++.h>
using namespace std;
namespace FAST{
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';c=getchar();
}
return x*f;
}
}
using namespace FAST;
int n,a[1000005],tree[1000005],len,pos[1000005],m,l[1000005],r[1000005],ans[1000005];
struct node{
int l,r,pos;
}nd[1000005];
bool cmp(node a,node b){
return a.r<b.r;
}
int lowbit(int x){
return x&-x;
}
int query(int x){
int sum=0;
for(int i=x;i>0;i-=lowbit(i)){
sum+=tree[i];
}
return sum;
}
void update(int x,int val){
for(int i=x;i<=n;i+=lowbit(i)){
tree[i]+=val;
}
return;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
update(i,1);
if(pos[a[i]])update(pos[a[i]],-1);
pos[a[i]]=i;
}
m=read();
for(int i=1;i<=m;i++){
nd[i].l=read();
nd[i].r=read();
nd[i].pos=i;
}
sort(nd+1,nd+1+m,cmp);
for(int i=1;i<=m;i++){
ans[nd[i].pos]=query(nd[i].r)-query(nd[i].l-1);
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}