制限時間4000ミリ秒
メモリ制限262144キロバイト
OSのWindows
中文题意
シーケンスは、2つの動作モードをサポートしています -
- 背中に番号を挿入し、配列の長さは1だけ増加させ
- 最大XORの間隔を尋ね
オンライン余儀なくされました。
問題解決のためのアイデア
基本的には、上の質問であるイワンとバーガーそれ。私はオンラインでソリューションの使用に関する質問があります。が、まだ証明されていません。
- [X]はの1100F codeforces イワンとバーガー単純XOR最大呼び掛けゾーン
- [X] 6579 HDU 動作データの動作挿入端複数、ならびに力によって
- [] BZOJ 4184 エシャロットオペレーティング挿入および欠失よりも、このタイトル以上。実際に地方自治体のタイトルは......忘れて何を測定します。
- [] UVALive 8514 XOR 2017ICPC西安の質問に、ほとんどすべての操作
ソース
#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAXN=1e6+5;
const int wide=31;
int T;
int n,m;
int p[MAXN][wide+2],pos[MAXN][wide+2];
void insert(int loc,int val)//location value
{
for(int i=wide;~i;i--)
{
p[loc][i]=p[loc-1][i];
pos[loc][i]=pos[loc-1][i];
}
int temp=loc;
for(int i=wide;~i;i--)
{
if((val>>i)&1)
{
if(!p[loc][i])
{
p[loc][i]=val;
pos[loc][i]=temp;
return;
}
if(pos[loc][i]<temp)//还是不太懂
{
std::swap(pos[loc][i],temp);
std::swap(p[loc][i],val);
}
val^=p[loc][i];
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(pos,0,sizeof(int)*(wide+2)*(n+2));
memset(p,0,sizeof(int)*(wide+2)*(n+2));
for(int i=1,v;i<=n;i++)
{
scanf("%d",&v);
insert(i,v);
}
int lastans=0;
while(m--)
{
int opt,l,r;
scanf("%d",&opt);
if(opt)
{
scanf("%d",&l);
l^=lastans;
insert(++n,l);
}
else
{
scanf("%d%d",&l,&r);
l=(l^lastans)%n+1;
r=(r^lastans)%n+1;
if(l>r) std::swap(l,r);
int ans=0;
for(int i=wide;~i;i--)
{
if((ans^p[r][i])>ans&&pos[r][i]>=l)
ans^=p[r][i];
}
printf("%d\n",lastans=ans);
}
}
}
return 0;
}