Description
有这么一群人决定随便做点什么。他们逐渐站成了一排。
而现在我们想知道每个人加入队伍后整个局面的友善值。
为了简化,我们这么描述这个问题:有n个无聊的人,对于一条长为m(n<=m)的线段,这n个人依次站到自己的位置上,其中第i个人位于位置pi(1<=pi<=m)上,且他的无聊值为bi(0<=bi<2^31)。我们定义一个队伍的友善值为每对相邻的人的契合度之和。两个人的契合度定义为他们的无聊值的异或值。
我们要知道的是在每个人加入之后整个队伍的友善值。为了更方便确认你能够得到答案,输出每个人加入后整个队伍的友善值的异或和即可。
Input
第1行:2个非负整数n,m,表示无聊的人数和线段的长度。
第2至n+1行:第i+1行2个整数表示第i个人的位置pi和无聊值bi。
Output
输出一个整数表示每个人加入后队伍的友善值的异或和。
Data Constraint
对于30%的数据,m,n<=1000
对于60%的数据,m,n<=100000
对于100%的数据,n<=1000000,m<=2000000,n<=m
并且对于任意i,j(1<=i<j<=n),有pi>pj或pi<pj
Solution
由于没有强制在线,我们可以倒着做一遍。
设sum表示所有数的异或和,并且记录每一个点的左边的点和右边的点。那么我们倒着搜,每搜到一个点时,用sum减去它与他左边和右边的异或值,再加上它左边与右边的异或值,每次用ans异或sum就行了。
Code
#include <cstdio>
#include <algorithm>
using namespace std;
struct nade
{
int p, b;
}a[1000007], c[1000007];
int n, m;
long long ans, sum;
int lt[2000007], nt[2000007