C. Propagating tree
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Iahub likes trees very much. Recently he discovered an interesting tree named propagating tree. The tree consists of n nodes numbered from 1 to n, each node i having an initial value ai. The root of the tree is node 1.

This tree has a special property: when a value val is added to a value of node i, the value -val is added to values of all the children of node i. Note that when you add value -val to a child of node i, you also add -(-val) to all children of the child of node i and so on. Look an example explanation to understand better how it works.

This tree supports two types of queries:

  • "1 x val" — val is added to the value of node x;
  • "2 x" — print the current value of node x.

In order to help Iahub understand the tree better, you must answer m queries of the preceding type.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 200000). The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 1000). Each of the next n–1 lines contains two integers vi and ui (1 ≤ vi, ui ≤ n), meaning that there is an edge between nodes vi and ui.

Each of the next m lines contains a query in the format described above. It is guaranteed that the following constraints hold for all queries: 1 ≤ x ≤ n, 1 ≤ val ≤ 1000.

Output

For each query of type two (print the value of node x) you must print the answer to the query on a separate line. The queries must be answered in the order given in the input.

Examples
Input
5 5
1 2 1 1 2
1 2
1 3
2 4
2 5
1 2 3
1 1 2
2 1
2 2
2 4
Output
3
3
0
Note

The values of the nodes are [1, 2, 1, 1, 2] at the beginning.

Then value 3 is added to node 2. It propagates and value -3 is added to it's sons, node 4 and node 5. Then it cannot propagate any more. So the values of the nodes are [1, 5, 1,  - 2,  - 1].

Then value 2 is added to node 1. It propagates and value -2 is added to it's sons, node 2 and node 3. From node 2 it propagates again, adding value 2 to it's sons, node 4 and node 5. Node 3 has no sons, so it cannot propagate from there. The values of the nodes are [3, 3,  - 1, 0, 1].

You can see all the definitions about the tree at the following link: http://en.wikipedia.org/wiki/Tree_(graph_theory)

思路:dfs序+线段树;

首先dfs序映射一下,然后转换成然后线段树维护,新然后开两个数组,一个作为正一个作为负。

复杂度n×log(n);

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<queue>
4 #include<stdlib.h>
5 #include<iostream>
6 #include<string.h>
7 #include<set>
8 #include<map>
9 #include<vector>
10 using namespace std;
11 typedef long long LL;
12 int ans[200005];
13 int id[200005];
14 int a[200005];
15 typedef vector<int> Ve;
16 vector<Ve>vec(200005);
17 bool flag[200005];
18 int cn = 0;
19 int l[200005];
20 int r[200005];
21 void dfs(int n,int p);
22 int tree1[200005*4];
23 int tree2[4*200005];
24 void update(int x,int n,int c);
25 int ask(int x);
26 int jiou[200005];
27 void update(int l,int r,int k,int nn,int mm,int co,int p)
28 {
29 if(l > mm||r < nn)
30 {
31 return ;
32 }
33 else if(l <= nn&& r >= mm)
34 {
35 if(p%2)tree1[k]+=co;
36 else tree2[k]+=co;
37 return ;
38 }
39 else
40 {
41 update(l,r,2*k+1,nn,(nn+mm)/2,co,p);
42 update(l,r,2*k+2,(nn+mm)/2+1,mm,co,p);
43 }
44 }
45 int ask1(int l,int r,int k,int nn,int mm)
46 {
47 if(l > mm || r < nn)
48 return 0;
49 else if(l <= nn&&r >= mm)
50 {
51 return tree1[k];
52 }
53 else
54 {
55 tree1[2*k+1] += tree1[k];
56 tree1[2*k+2] += tree1[k];
57 tree1[k] = 0;
58 int nx = ask1(l,r,2*k+1,nn,(nn+mm)/2);
59 int ny = ask1(l,r,2*k+2,(nn+mm)/2+1,mm);
60 return nx + ny;
61 }
62 }
63 int ask2(int l,int r,int k,int nn,int mm)
64 {
65 if(l > mm || r < nn)
66 return 0;
67 else if(l <= nn&&r >= mm)
68 {
69 return tree2[k];
70 }
71 else
72 {
73 tree2[2*k+1] += tree2[k];
74 tree2[2*k+2] += tree2[k];
75 tree2[k] = 0;
76 int nx = ask2(l,r,2*k+1,nn,(nn+mm)/2);
77 int ny = ask2(l,r,2*k+2,(nn+mm)/2+1,mm);
78 return nx + ny;
79 }
80 }
81 int main(void)
82 {
83 int n,m;
84 scanf("%d %d",&n,&m);
85 for(int i = 1; i <= n; i++)
86 {
87 scanf("%d",&a[i]);
88 }
89 for(int i = 1; i < n; i++)
90 {
91 int x,y;
92 scanf("%d %d",&x,&y);
93 vec[x].push_back(y);
94 vec[y].push_back(x);
95 }
96 dfs(1,1);
97 for(int i = 1; i <= n; i++)
98 id[ans[i]] = i;
99 while(m--)
100 {
101 int val;
102 int co,ic;
103 scanf("%d %d",&val,&ic);
104 if(val == 1)
105 {
106 scanf("%d",&co);
107 update(l[ic],r[ic],0,1,cn,co,jiou[ic]);
108 }
109 else
110 {
111 int xx = ask1(id[ic],id[ic],0,1,cn);
112 int yy = ask2(id[ic],id[ic],0,1,cn);
113 //printf("%d\n",xx);
114 if(jiou[ic]%2)
115 {
116 printf("%d\n",xx-yy+a[ic]);
117 }
118 else printf("%d\n",yy-xx+a[ic]);
119 }
120 }
121 return 0;
122 }
123 void dfs(int n,int p)
124 {
125 flag[n] = true;
126 ans[++cn] = n;
127 l[n] = cn;
128 jiou[n] = p;
129 for(int i = 0; i < vec[n].size(); i++)
130 {
131 int x = vec[n][i];
132 if(!flag[x])
133 dfs(x,p+1);
134 }
135 r[n] = cn;
136 }

C. Propagating tree的更多相关文章

  1. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  2. Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树

    题目链接:点击传送 E. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  3. AC日记——Propagating tree Codeforces 383c

    C. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. CodeForces 383C Propagating tree

    Propagating tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  5. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+ 树状数组或线段树

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  6. 题解 CF383C 【Propagating tree】

    这道题明明没有省选难度啊,为什么就成紫题了QAQ 另:在CF上A了但是洛谷Remote Judge玄学爆零. 思路是DFS序+线段树. 首先这道题直观上可以对于每一次修改用DFS暴力O(n),然后对于 ...

  7. codeforces 383C Propagating tree 线段树

    http://codeforces.com/problemset/problem/383/C 题目就是说,  给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...

  8. Codeforces 383C . Propagating tree【树阵,dfs】

    标题效果: 有一棵树,有两种操作模式对本树:1:表示为(1 x val),在NOx加在节点上val,然后x每个节点加上儿子- val.给每个儿子一个儿子在一起-(- val),加到没有儿子为止.2:表 ...

  9. CodeForces 384E Propagating tree (线段树+dfs)

    题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 - ...

随机推荐

  1. Excel-条件判断

    5.条件判断 IFS(条件1,真1,假1-条件2,真2,假2-条件n,真n,假n-条件n+1,...,TRUE,执行)   #可以嵌套164个(大概!具体忘了) IF(条件1,真,假)

  2. (转载)SQL Server 2008 连接JDBC详细图文教程

    点评:SQL Server 2008是目前windows上使用最多的sql数据库,2008的安装机制是基于framework重写的,特点是非常耗时间SQL Server 2008是目前windows上 ...

  3. Navicat连接Linux系统下的Mysql数据库

    1 . 进入Linux机器 , 登录并进入mysql如果没有安装mysql,参照 https://blog.csdn.net/weixin_35353187/article/details/81712 ...

  4. 用UIScrollview做一个网易scrollviewbar

    效果如上,点击出现的图片是用UIImageview添加上的,比较简陋 我用了两种方法,第一种是直接在viewcontroller里面写代码 第二种是用了一个类来封装这个scrollviewbar 对外 ...

  5. 转 android开发笔记之handler+Runnable的一个巧妙应用

    本文链接:https://blog.csdn.net/hfreeman2008/article/details/12118817 版权 1. 一个有趣Demo: (1)定义一个handler变量 pr ...

  6. Spring(1):Spring介绍

    一,Spring简介: Spring是一个开源框架,它由Rod Johnson创建:它是为了解决企业应用开发的复杂性而创建的 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架 ...

  7. mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'

    1. 问题:服务启动时,日志报错,导致启动失败: Caused by: com.mysql.cj.exceptions.CJException: null,  message from server: ...

  8. 【编程思想】【设计模式】【行为模式Behavioral】Publish_Subscribe

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/publish_subscribe.py #!/usr/b ...

  9. 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN

    层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...

  10. 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南

    Minio的元数据 数据存储 MinIO对象存储系统没有元数据数据库,所有的操作都是对象级别的粒度的,这种做法的优势是: 个别对象的失效,不会溢出为更大级别的系统失效. 便于实现"强一致性& ...