代码全RE,不知道哪里错了,数组开到 107还是RE。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int MAXNUM=1e7+50;
struct Node
{
int l,r,i;
}e[MAXNUM];
bool cmp(Node a,Node b)
{
return a.r<b.r;
}
int lowbit(int x)
{
return x&-x;
}
int add(int x,int c,int n,int tr[])
{
for(int i=x;i<=n;i+=lowbit(i))
tr[i]+=c;
}
int sum(int x,int tr[])
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
ans+=tr[i];
return ans;
}
int N,M;
int a[MAXNUM],tr[MAXNUM];
int flag[MAXNUM];
int ans[MAXNUM];
int main()
{
cin>>N;
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
}
cin>>M;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&e[i].l,&e[i].r);
e[i].i=i;
}
sort(e+1,e+M+1,cmp);
int Nowi=0;
for(int i=1;i<=M;i++)
{
while(Nowi<e[i].r)
{
Nowi++;
if(flag[a[Nowi]]==0)
{
add(Nowi,1,N,tr);
flag[a[Nowi]]=Nowi;
}
else
{
add(flag[a[Nowi]],-1,N,tr);
add(Nowi,1,N,tr);
flag[a[Nowi]]=Nowi;
}
}
ans[e[i].i]=sum(e[i].r,tr)-sum(e[i].l-1,tr);
}
for(int i=1;i<=M;i++)
{
printf("%d\n",ans[i]);
}
}