当前位置: 代码迷 >> 综合 >> 51Nod 1295 XOR key(可持久化字典树)
  详细解决方案

51Nod 1295 XOR key(可持久化字典树)

热度:94   发布时间:2023-12-01 21:26:23.0

题目传送门
代码:

#include<cstdio>
using namespace std;const int maxn=50000+100,maxm=maxn*40;int trie[maxm][3],root[maxn],cnt;
bool bit[35];int read()
{int x=0;char c;for(c=getchar();c<'0' || c>'9';c=getchar());for(;c>='0' && c<='9';c=getchar()) x=x*10+c-'0';return x;
}inline void update(int &New,int Old,int ind){New=++cnt;for(int i=0;i<3;i++) trie[New][i]=trie[Old][i];trie[New][2]++;if(ind==0) return ;int x=bit[ind-1];update(trie[New][x],trie[Old][x],ind-1); 
}inline int query(int L,int R,int ind){if(ind==0) return 0;int x=bit[ind-1];if(trie[trie[R][x]][2]>trie[trie[L][x]][2]) return  query(trie[L][x],trie[R][x],ind-1)+(1<<(ind-1));return query(trie[L][1-x],trie[R][1-x],ind-1); 
}int main(){int n,m;n=read();m=read();for(int i=1;i<=n;i++){int val;val=read(); for(int j=0;j<30;val>>=1,j++) bit[j]=val%2;update(root[i],root[i-1],30);}while(m--){int val,l,r;val=read();l=read();r=read(); for(int i=0;i<30;val>>=1,i++) bit[i]=(1-val%2);printf("%d\n",query(root[l],root[r+1],30));}
}