省选前刷道LCT板题(话说之前没做这道题…)

CODE

#include<bits/stdc++.h>
using namespace std;
inline void read(int &num) {
char ch; int flg = 1; while(!isdigit(ch=getchar()))if(ch=='-')flg = -flg;
for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar()); num*=flg;
}
const int MAXN = 100005;
const int mod = 51061;
namespace LCT {
#define ls ch[x][0]
#define rs ch[x][1]
int ch[MAXN][2], fa[MAXN], w[MAXN], sum[MAXN];
bool rev[MAXN];
inline bool isr(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
inline bool get(int x) { return ch[fa[x]][1] == x; }
inline void upd(int x) { sum[x] = sum[ls] ^ sum[rs] ^ w[x]; }
inline void mt(int x) { if(rev[x]) rev[ls]^=1, rev[rs]^=1, rev[x]^=1, swap(ls, rs); }
void mtpath(int x) { if(!isr(x)) mtpath(fa[x]); mt(x); }
inline void rot(int x) {
int y = fa[x], z = fa[y]; bool l = get(x), r = l^1;
if(!isr(y)) ch[z][get(y)] = x;
fa[ch[x][r]] = y; fa[y] = x; fa[x] = z;
ch[y][l] = ch[x][r]; ch[x][r] = y;
upd(y), upd(x);
}
inline void splay(int x) {
mtpath(x);
for(; !isr(x); rot(x))
if(!isr(fa[x])) rot(get(fa[x])==get(x)?fa[x]:x);
}
inline int access(int x) { int y = 0;
for(; x; x=fa[y=x]) splay(x), ch[x][1] = y, upd(x);
return y;
}
inline void bert(int x) { access(x), splay(x), rev[x]^=1; }
inline int sert(int x) { access(x), splay(x); int y = x; for(; ch[x][0]; x=ch[x][0]); splay(x), splay(y); return x; }
inline void Link(int x, int y) { bert(x); if(sert(y) != x) fa[x] = y; }
inline void Cut(int x, int y) { bert(x); if(sert(y) == x && fa[x] == y && !ch[x][1]) fa[x] = ch[y][0] = 0, upd(y); }
inline int split(int x, int y) { bert(x), access(y), splay(y); return y; }
inline void Modify(int x, int val) { bert(x), w[x] = val, upd(x); }
inline int Query(int x, int y) { return sum[split(x, y)]; }
#undef ls
#undef rs
}
using namespace LCT;
int n, q;
int main() {
//freopen("sample.txt", "r", stdin);
read(n), read(q);
for(int i = 1; i <= n; ++i)
read(w[i]), sum[i] = w[i];
int op, x, y;
while(q--) {
read(op), read(x), read(y);
switch(op) {
case 0: printf("%d\n", Query(x, y)); break;
case 1: Link(x, y); break;
case 2: Cut(x, y); break;
case 3: Modify(x, y); break;
}
}
}

最新文章

  1. [bootstrap]bootstrap2如何引导div垂直居中
  2. C#中关于异步的三种写法
  3. CodeGenerator.cs
  4. Django数据库怎么给字段设置主键
  5. Daily Scrum5
  6. hibernate中多对多关联
  7. 通过Java字节码发现有趣的内幕之String篇(上)(转)
  8. 简单的虚拟摇杆控制移动(NGUI)
  9. SqlBulkCopy效率低下原因分析
  10. 【Luogu3806】点分治(点分治)
  11. TestNG详解-深度好文
  12. 大数据学习之hdfs集群安装部署04
  13. CSL 的神奇序列(猜猜猜?)
  14. this容易混淆的示例
  15. MVC四大筛选器—ActionFilter&amp;ResultedFilter
  16. Active Directory、Exchange、单点登录,企业账号统一管理解决方案
  17. PL/SQL如何设置当前格局确保每次打开都给关闭前一样
  18. MongoDB MapReduce 的示例。
  19. 网卡bonding模式 - bond0、1、4配置
  20. Viewpoint Meta标签

热门文章

  1. XML基础知识归纳(通俗易懂)
  2. Nginx 开发者文档翻译 - 介绍
  3. [转帖]Keccak简介
  4. 二、点亮LED
  5. ASP.NET Core 过滤器
  6. 2019牛客多校一 H. XOR (线性基)
  7. 怎样获取当前对象的原型对象prototype
  8. a2 Bluebottle OS
  9. springboot2.0介绍1
  10. python matplotlib以日期为x轴作图