题意:给以一颗有n个节点的树,给你m次操作。n<5e5,m<2000
操作有:对一条链加x,异或x,减x,求和,求异或和,求最大值减最小值,求和k最接近的数
思路:因为m只有2000次,所以需要操作的点不会特别多,可以参考离散化的思想,把重要的点建一颗虚树,虚树的大小是o(m)的。原树除了重要点之后剩下了一些链接重要点的链,我们可以把这些链缩成一个点,因为这些链上每个点的值都是相同的。
新的虚树就包含了,操作点,操作点的lca,和缩完的点,对每一次操作暴力即可。
#include <bits/stdc++.h>
using namespace std;
#define N 500005
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define go(i,a,b) for(int i=(a);i<=(b);i++)
#define dep(i,a,b) for(int i=(a);i>=(b);i--)
#define add(a,b) ((a+=(b))%=mod)
vector<int>path[N],vir[N];
stack<int>q[N];
int is[N],iss[N],dep[N],w[N],siz[N],fa[N];
ll a[N];
void dfs(int u,int fat,int depth){
dep[u]=depth;w[u]=u;siz[u]=1;
int sum=0,pos=-1;
for(auto to:path[u])