7GOJ 23 fleet [主席树]

来源:互联网 发布:qq飞车数据异常 编辑:程序博客网 时间:2024/05/16 08:15

SPOJ D-Query的强制版,水题。

#include<map>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define mid ((l+r)>>1)const int N=200010;int root[N],tot,val[N],lastans,n,q,la,ra,tmp;map<int,int> M;struct node{    int ls,rs,ret;}tree[N*40];inline void build(int l,int r,int &rt,int x,int id,int w){    tree[++tot]=tree[x],tree[rt=tot].ret+=w;    if(l==r)return;    if(mid>=id)build(l,mid,tree[rt].ls,tree[x].ls,id,w);    else build(mid+1,r,tree[rt].rs,tree[x].rs,id,w);}inline int query(int x,int l,int r,int rt){    if(l>=x)return tree[rt].ret;    if(mid>=x)return query(x,l,mid,tree[rt].ls)+tree[tree[rt].rs].ret;    else return query(x,mid+1,r,tree[rt].rs);}inline void read(int &res){    static char ch;int flag=1;    while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;    while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}int main(){    read(n);    for(register int i=1;i<=n;++i){        read(val[i]);        if(!M.count(val[i]))            build(1,n,root[i],root[i-1],i,1);        else            build(1,n,tmp,root[i-1],M[val[i]],-1),            build(1,n,root[i],tmp,i,1);        M[val[i]]=i;    }    read(q);    for(register int i=1;i<=q;++i){        read(la),read(ra);        la^=lastans,ra^=lastans;        printf("%d\n",lastans=query(la,1,n,root[ra]));    }    return 0;}
原创粉丝点击