1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性。

。。还是得加上好= =

 #include <iostream>
#include <cstdio>
#define N 300010
using namespace std;
int n,m;
struct node
{
node *fa,*ch[];
int xor_sum,data;
bool rev;
node(int x);
bool chr() {return this==fa->ch[];}
bool isrt() {return this!=fa->ch[] && this!=fa->ch[];}
void setc(node *x,int t) {this->ch[t]=x; x->fa=this;}
void push_up() {xor_sum=ch[]->xor_sum^ch[]->xor_sum^data;}
void push_down()
{
if (!isrt()) fa->push_down();
if (rev)
{
ch[]->rev^=;
ch[]->rev^=;
swap(ch[],ch[]);
rev=;
}
}
}*null=new node(),*lct[N];
node::node(int x)
{
fa=ch[]=ch[]=null;
data=xor_sum=x;
rev=;
}
inline int read()
{
int ans=,f=;
char c;
while (!isdigit(c=getchar())){if (c=='-') f=-;}
ans=c-'';
while (isdigit(c=getchar())) ans=ans*+c-'';
return ans*f;
}
namespace LCT
{
void rotate(node *x)
{
node *r=x->fa;
int t=x->chr();
if (x==null || r==null) return;
//x->push(); y->push();
if (r->isrt()) x->fa=r->fa;
else r->fa->setc(x,r->chr());
r->setc(x->ch[t^],t);
x->setc(r,!t);
x->push_up(); r->push_up();
}
void splay(node *x)
{
x->push_down();
for (;!x->isrt();rotate(x))
if (!x->fa->isrt())
if (x->chr()==x->fa->chr()) rotate(x->fa);
else rotate(x);
x->push_up();
}
void Access(node *x)
{
node *y=null;
for (;x!=null;y=x,x=x->fa)
{
splay(x);
x->ch[]=y;
}
}
void MakeRoot(node *x)
{
Access(x); splay(x); x->rev^=;
}
void Link(node *x,node *y)
{
MakeRoot(x); //Access(y); splay(y);
x->fa=y;
}
void Cut(node *x,node *y)
{
MakeRoot(x); Access(y); splay(y);
y->ch[]->fa=null; y->ch[]=null;
}
node *Findfa(node *x)
{
Access(x); splay(x);
while (x->ch[]!=null) x=x->ch[];
return x;
}
void Change(node *x,int v)
{
x->push_down();
splay(x);
x->data=v;
x->push_up();
}
int Query(node *x,node *y)
{
MakeRoot(x);
Access(y);
splay(y);
return y->xor_sum;
}
}
using namespace LCT;
int main()
{
int temp,x,y;
n=read();
m=read();
for (int i=;i<=n;i++) x=read(),lct[i]=new node(x);
for (int i=;i<=m;i++)
{
temp=read(); x=read(); y=read();
switch (temp)
{
case :printf("%d\n",LCT::Query(lct[x],lct[y])); break;
case :if (Findfa(lct[x])!=Findfa(lct[y])) Link(lct[x],lct[y]); break;
case :if (Findfa(lct[x])==Findfa(lct[y])) Cut(lct[x],lct[y]); break;
case :Change(lct[x],y); break;
}
}
return ;
}

Description

给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。

0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。

1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。

2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。

3:后接两个整数(x,y),代表将点X上的权值变成Y。

Input

第1行两个整数,分别为N和M,代表点数和操作数。

第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。

第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。

Output

对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。

Sample Input

3 3
1
2
3
1 1 2
0 1 2
0 1 1

Sample Output

3
1

HINT

1<=N,M<=300000

Source

【BZOJ3282】Tree LCT的更多相关文章

  1. 【BZOJ3282】Tree (Link-Cut Tree)

    [BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...

  2. 【bzoj2631】tree LCT

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:+ u v c:将u到v的路径上的点的权值都加上自然数c:- u1 v1 u2 v2:将树中原有的边( ...

  3. 【bzoj3282】Tree

    LCT模板题: 话说xor和的意思是所有数xor一下: #include<iostream> #include<cstdio> #include<cstring> ...

  4. 【BZOJ】【2631】Tree

    LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...

  5. 【Luogu1501】Tree(Link-Cut Tree)

    [Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...

  6. 【POJ3237】Tree 树链剖分+线段树

    [POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...

  7. 【AtCoder3611】Tree MST(点分治,最小生成树)

    [AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...

  8. 【HDU5909】Tree Cutting(FWT)

    [HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...

  9. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

随机推荐

  1. web service 学习

    是什么? 是一种远程调用技术,这种技术提供一些接口,这些接口实现让客户端和服务端进行通信和数据交换,并且让通信和交换与平台和开发语言无关.也可以说是提供了许多函数.客户端调用服务端的函数. 远程调用: ...

  2. 盒子模型简单理解(box-sizing)

    普通解析: 概念图示和公式: html结构 <div class="num1"></div> 1.只写 width.height(写背景是为了区分) .nu ...

  3. Java编程中“为了性能”需做的26件事

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: (1)控制资源的使用,通过线程同步来控制 ...

  4. LwIP移植和使用

    LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539  email: 93743 ...

  5. MVC项目使用easyui的filebox控件上传文件

    开发环境:WIN10+IE11,浏览器请使用IE10或以上版本 开发技术框架MVC4+JQuery Easyui+knockoutjs 效果为弹出小窗体,如下图 1.前端cshtml文件代码(只包含文 ...

  6. Windows环境配置HTTP服务(Windows + Apache + Mysql + PHP)

    1.安装WampServer 2.管理HTTP服务 任务图标绿色为正常启动状态 注意事项:1.检查网络是不是通的 ping 对方IP2.检查防火墙是否开启,如果开启将不能正常被访问3.检查访问权限 A ...

  7. java基础 字符串 “==” 和 “equals” 比较

    demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...

  8. [BZOJ3173][Tjoi2013]最长上升子序列

    [BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...

  9. 2016年11月27日--面向对象:多态、类库、委托、is和as运算符、泛型集合

    1.虚方法 virtual 重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写,子类重写父类的方法 ...

  10. Eclipse 设置SVN忽略文件

    1.在 Eclipse 中点击菜单 window --> Preferences --> Team --> Ignored Resources 2.在Eclipse的导航视图中,选中 ...