http://acm.hdu.edu.cn/showproblem.php?pid=6356
又是随机数,上一场刚打了一个随机数,赛后题解的姿势就很好,今天又遇到了随机数,不知道线段树为啥能过,我还是区间更新,有的单点更新,单点查询就过了,所以以后遇到随机数就是暴力,加点技巧的暴力。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1000005;
const int mod=(1<<30);
unsigned x,y,z;
unsigned f[15000010];
struct Tree
{
int left,right;
ll minn,add,maxx;
};
Tree tree[maxn<<2];
void pushup(int id)
{
tree[id].minn=min(tree[id*2].minn,tree[id*2+1].minn);
tree[id].maxx=max(tree[id*2].maxx,tree[id*2+1].maxx);
}
void pushdown(int id)
{
if(tree[id].add)
{
tree[id*2].add=tree[id].add;
tree[id*2+1].add=tree[id].add;
tree[id*2].minn=tree[id].add;
tree[id*2+1].minn=tree[id].add;
tree[id*2].maxx=tree[id].add;
tree[id*2+1].maxx=tree[id].add;
tree[id].add=0;
}
}
void build(int id,int l,int r)
{
tree[id].left=l;
tree[id].right=r;
tree[id].add=0;
if(l==r)
{
tree[id].minn=0;
tree[id].maxx=0;
}
else
{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
pushup(id);
}
}
void update(int id,int l,int r,ll val)
{
if(tree[id].minn>=val)
return;
if(l<=tree[id].left&&tree[id].right<=r&&tree[id].maxx<val)
{
tree[id].maxx=val;
tree[id].minn=val;
tree[id].add=val;
return;
}
pushdown(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid)
update(id*2,l,r,val);
else if(l>mid)
update(id*2+1,l,r,val);
else
{
update(id*2,l,mid,val);
update(id*2+1,mid+1,r,val);
}
pushup(id);
}
ll query(int id,int l,int r)
{
if(l<=tree[id].left&&tree[id].right<=r)
return tree[id].minn;
pushdown(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid)
return query(id*2,l,r);
else if(l>mid)
return query(id*2+1,l,r);
else
return min(query(id*2,l,mid),query(id*2+1,mid+1,r));
}
unsigned get()
{
x=x^(x<<11);
x=x^(x>>4);
x=x^(x<<5);
x=x^(x>>14);
unsigned w=x^(y^z);
x=y;
y=z;
z=w;
return z;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d%d%d%d",&n,&m,&x,&y,&z);
for(int i=1;i<=3*m;i++)
{
f[i]=get();
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int l=min(f[3*i-2]%n+1,f[3*i-1]%n+1);
int r=max(f[3*i-2]%n+1,f[3*i-1]%n+1);
int w=f[3*i]%mod;
update(1,l,r,w);
}
ll sum=0;
for(int i=1;i<=n;i++)
{
ll w=query(1,i,i);
//cout<<w<<endl;
sum^=(w*i);
}
printf("%lld\n",sum);
}
return 0;
}