【JSOI冬令营2019 A组, Day1T1】小 L 的占卜

题目链接

Code:

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
template<typename T> void read(T &num){
    char c=getchar();num=0;T f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
    num*=f;
}
template<typename T> void qwq(T x){
    if(x>9)qwq(x/10);
    putchar(x%10+'0');
}
template<typename T> void write(T x){
    if(x<0){x=-x;putchar('-');}
    qwq(x);putchar('\n');
}
int num,n,m;
struct wzy{
    int ll,rr,pos;
}qj[1000010];
map<int,int>last;
int co[1000010];int pre[1000010];int ans[1000010];
int nxt[1000010];bool flag[1000010];
inline bool cmp(wzy a,wzy b){
    return a.ll<b.ll;
}

int tree[1000010];
inline int lowbit(int x){return x&(-x);}
inline void change(int x,int y){
    while(x<=n){tree[x]^=y;x+=lowbit(x);}
    return;
}
inline int query(int x){
    int ans=0;
    while(x){ans^=tree[x];x-=lowbit(x);}
    return ans;
}

int main(){
    read(num);read(n);read(m);
    rep(i,1,n){read(co[i]);pre[i]=(pre[i-1]^co[i]);}
    
    int len=0;
    rep(i,1,m){
        int l,r,t;read(l);read(r);read(t);
        if(!t){ans[i]=(pre[r]^pre[l-1]);}
        else{qj[++len].ll=l;qj[len].rr=r;qj[len].pos=i;}
    }
    sort(qj+1,qj+len+1,cmp);
    rep2(i,n,1){nxt[i]=last[co[i]];last[co[i]]=i;flag[nxt[i]]=1;}
    rep(i,1,n){if(!flag[i]){change(i,co[i]);}}
    
    int pos=0;qj[len+1].ll=INT_MAX;
    rep(i,1,n){
        while(i>qj[pos].ll){pos++;}
        while(i==qj[pos].ll){ans[qj[pos].pos]=((pre[qj[pos].rr]^pre[i-1])^query(qj[pos].rr));pos++;}
        change(i,co[i]);if(nxt[i]){change(nxt[i],co[i]);}
        if(pos==len+1)break;
    }
    
    rep(i,1,m){write(ans[i]);}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Bill_Benation/article/details/86990138