记录编号 400535 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 GravatarHzoi_Ivan 是否通过 通过
代码语言 C++ 运行时间 1.143 s
提交时间 2017-04-30 16:10:04 内存使用 51.03 MiB
显示代码纯文本
#include<cstdio>
#define N 100005
using namespace std;
int cnt,n,m,a[N],next[N],head[10*N],sum[40*N];
int lon[40*N],ron[40*N],root[N],ll,rr;
void build(int &u,int l,int r)
{
     u=++cnt;
     if(l==r) return;
     int m=(l+r)/2;
     build(lon[u],l,m);
     build(ron[u],m+1,r);
}
void update(int p,int &u,int l,int r,int x)
{
     u=++cnt;
     sum[u]=sum[p]+1;
     lon[u]=lon[p]; ron[u]=ron[p];
     if(l==r) return;
     int m=(l+r)/2;
     if(x<=m)
       update(lon[p],lon[u],l,m,x);
     if(x>m) 
       update(ron[p],ron[u],m+1,r,x);
}
int query(int p,int u,int l,int r,int x)
{
    if(x>=r) return sum[u]-sum[p];
    if(x<l) return 0;
    int m=(l+r)/2;
    return query(lon[p],lon[u],l,m,x)+query(ron[p],ron[u],m+1,r,x);
}
int main()
{
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
      scanf("%d",&a[i]);
      next[i]=head[a[i]];
      head[a[i]]=i;
    }
    build(root[0],0,n);
    for(int i=1;i<=n;i++)
      update(root[i-1],root[i],0,n,next[i]);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
      scanf("%d%d",&ll,&rr);
      printf("%d\n",query(root[ll-1],root[rr],0,n,ll-1));
    }
    //while(1);
    return 0;
}