Dylans loves tree

view code#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#define REP(i, n) for(int i = 0; i < (n); ++i)
#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
typedef vector<int > VI;
typedef pair<int, int > PII;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 100010;
int _, cas=1, n, Q, m, val[N], seg[N << 2]; struct Edge {
int u, v, next;
Edge() {}
Edge(int u, int v, int next):u(u), v(v), next(next) {}
}e[N << 1];
int head[N], ecnt; void add(int u, int v) {
e[ecnt] = Edge(u, v, head[u]);
head[u] = ecnt++;
} int dep[N], fa[N], sz[N], top[N], id[N], fid[N], gid, son[N];
void dfs(int u, int f, int d) {
fa[u] = f, sz[u] = 1, dep[u] = d, son[u] = 0;
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(v == f) continue;
dfs(v, u, d + 1);
sz[u] += sz[v];
if(sz[ son[u] ] < sz[v]) son[u] = v;
}
} void getpos(int u, int f) {
id[u] = ++gid;
fid[gid] = u;
top[u] = f;
if(!son[u]) return ;
getpos(son[u], f);
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
if(v == son[u] || v == fa[u]) continue;
getpos(v, v);
}
} void pushUp(int rt) {
seg[rt] = seg[rt << 1] ^ seg[rt << 1 | 1];
} void build(int l, int r, int rt) {
if(l == r) {
seg[rt] = val[ fid[l] ];
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
pushUp(rt);
} void update(int p, int c, int l, int r, int rt) {
if(l == r) {
seg[rt] = c;
return ;
}
int m = (l + r) >> 1;
if(p <= m) update(p, c, lson);
else update(p, c, rson);
pushUp(rt);
} int query(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) return seg[rt];
int m = (l + r) >> 1, ans = 0;
if(L <= m) ans ^= query(L, R, lson);
if(R > m) ans ^= query(L, R, rson);
return ans;
} int lca(int u, int v) {
int fu = top[u], fv = top[v], ans = 0, dis = 0;
while(fu != fv) {
if(dep[fu] < dep[fv]) {
swap(fu, fv), swap(u, v);
}
ans ^= query(id[fu], id[u], 1, n, 1);
dis += id[u] - id[fu] + 1;
u = fa[fu];
fu = top[u];
}
if(dep[u] < dep[v]) swap(u, v);
ans ^= query(id[v], id[u], 1, n, 1);
dis += id[u] - id[v] + 1;
return (dis & 1) ? ans : -1;
} void solve() {
scanf("%d%d", &n, &Q); ecnt = 0;
memset(head, -1, sizeof(head[0]) * sizeof(n +5));
int u, v;
REP(i, n - 1) {
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
FOR(i, 1, n) {
scanf("%d", &val[i]);
} sz[0] = 0;
gid = 0;
dfs(1, 1, 0);
getpos(1, 1);
build(1, n, 1); int flag;
while(Q--) {
scanf("%d%d%d", &flag, &u, &v);
if(flag) {
printf("%d\n", lca(u, v));
} else {
update(id[u], v, 1, n, 1);
}
}
} int main()
{
cin >> _;
while(_--) solve();
return 0;
}

hdu Dylans loves tree [LCA] (树链剖分)的更多相关文章

  1. HDU 5274 Dylans loves tree(树链剖分)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5274 [题目大意] 给出一棵树,每个点有一个权值,权值可修改,且大于等于0,询问链上出现次数为奇数 ...

  2. poj 3237 Tree [LCA] (树链剖分)

    poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...

  3. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)

    Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...

  5. [BZOJ3626] [LNOI2014]LCA(树链剖分)

    [BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...

  6. Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分

    D. Happy Tree Party     Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...

  7. HDU 5044 Tree(树链剖分)

    HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...

  8. HDU 4718 The LCIS on the Tree(树链剖分)

    Problem Description For a sequence S1, S2, ... , SN, and a pair of integers (i, j), if 1 <= i < ...

  9. 【POJ3237】Tree(树链剖分)

    题意:在一棵N个节点,有边权的树上维护以下操作: 1:单边修改,将第X条边的边权修改成Y 2:区间取反,将点X与Y在树上路径中的所有边边权取反 3:区间询问最大值,询问X到Y树上路径中边权最大值 n& ...

随机推荐

  1. HTTP错误大全 404 200 501 502 505

    HTTP错误 大全 403 401 400 404 304 200 HTTP 400 - 请求无效 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录 ...

  2. [转载]jQuery诞生记-原理与机制

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3520 一.看似偶然的 ...

  3. angular学习的一些小笔记(中)之ng-init

    ng-init是给angular执行给定的表达式,初始化变量的值 <!DOCTYPE html> <html> <head> <meta charset='U ...

  4. js控住DOM实现发布微博简单效果

    这段代码的效果具体是输入标题和内容,点击发布把消息发布出去,并使最新的消息始终在内容的最上面,代码为: <!DOCTYPE html> <html lang="en&quo ...

  5. ae IMap接口成员

    使用IMap接口显示各种数据源的数据.IMap接口的成员ActiveGraphicsLayer:活动图形图层,如果没有将创建一个基本memory graphics layer.AddLayer:向地图 ...

  6. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q25-Q28)

    Question 25 You are designing a SharePoint 2010 farm in your organization. You need to design the li ...

  7. android绘制view的过程

    1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):            下面看看每一步的动作到底是 ...

  8. 你真的了解UIButton、UILabel 吗?

    一:首先查看一下关于UIButton的定义 @class UIImage, UIFont, UIColor, UIImageView, UILabel; //设置UIButton的样式 typedef ...

  9. 手动配置 Android SDK

      下载地址与说明http://www.androiddevtools.cn/#sdk-list   手动添加 SDK   这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或 ...

  10. AFNetworking菊花转圈圈

    注意,此圈圈是在左上角,特别小,不注意是看不到的 加载这个东西,要先引入头文件: AFNetworkActivityIndicatorManager.h 然后只要一句代码就可以实现,默认情况下AFN的 ...