因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]。

首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和

然后就是可持久化trie的板子了

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,m,a[N],b[N],rt[N],cnt;
char c[];
struct qwe
{
int c[],sum;
}t[N*];
int read()
{
int r=;
char p=getchar();
while(p>''||p<'')
p=getchar();
while(p>=''&&p<='')
{
r=r*+p-;
p=getchar();
}
return r;
}
int add(int x,int v)
{
int tmp=++cnt,y=cnt;
for(int i=;i>=;i--)
{
t[y].c[]=t[x].c[];
t[y].c[]=t[x].c[];
t[y].sum=t[x].sum+;
int q=(v&(<<i))>>i;
x=t[x].c[q];
t[y].c[q]=++cnt;
y=t[y].c[q];
}
t[y].sum=t[x].sum+;
return tmp;
}
int ques(int l,int r,int v)
{
int re=;
for(int i=;i>=;i--)
{
int q=(v&(<<i))>>i;
if(t[t[r].c[q^]].sum-t[t[l].c[q^]].sum)
re+=(<<i),l=t[l].c[q^],r=t[r].c[q^];
else
l=t[l].c[q],r=t[r].c[q];
}
return re;
}
int main()
{
n=read(),m=read();
n++;
for(int i=;i<=n;i++)
a[i]=read();
for(int i=;i<=n;i++)
b[i]=b[i-]^a[i];
for(int i=;i<=n;i++)
rt[i]=add(rt[i-],b[i]);
while(m--)
{
scanf("%s",c);
if(c[]=='A')
{
a[++n]=read();
b[n]=b[n-]^a[n];
rt[n]=add(rt[n-],b[n]);
}
else
{
int l=read(),r=read(),x=read();
printf("%d\n",ques(rt[l-],rt[r],b[n]^x));
}
}
return ;
}
/*
5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
*/

最新文章

  1. 万向节锁(Gimbal Lock)的理解
  2. Android屏幕适配总结
  3. angularjs之ng-bind和ng-model
  4. 判断CAD版本
  5. C#画线源码
  6. Android中内容观察者的使用---- ContentObserver类详解
  7. mysql 5.6 oom 图
  8. 信息安全实验一:buffer-overflow
  9. Codeforces 549G. Happy Line 馋
  10. Maven项目搭建(三):Maven直接部署项目
  11. jzoj6099. 【GDOI2019模拟2019.4.1】Dist
  12. docsis cm 上线过程(bigwhite)
  13. dva,清除模块数据
  14. C#,如何程序使用正则表达式如何使用匹配的位置的结果修改匹配到的值
  15. [Luogu 3613] 睡觉困难综合征
  16. 【转】 多线程之linux线程调度策略
  17. 输//ip提示找不到应用程序
  18. Python学习(002)--Python介绍
  19. 江苏公务员职位表导入MySQL
  20. [Pytorch]Pytorch加载预训练模型(转)

热门文章

  1. linux的主分区与逻辑分区的关系
  2. AngularJs概述
  3. 日常方便使用的Python脚本实现
  4. Android studio 百度地图开发(2)地图定位
  5. redis中关于过期键的删除策略
  6. HDU 3065 病毒侵袭持续中(AC自己主动机)
  7. spark 33G表
  8. MTK平台下Battery驱动分析
  9. html5--6-19 CSS3中的文字与字体
  10. Silverlight中使用MVVM(3)