国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj4034

2019-11-06 06:36:02
字體:
來源:轉載
供稿:網友
//bzoj4034
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>typedef long long ll;typedef const int cint;typedef const long long cll;template <typename tp>inline void readln(tp &x) {	register char ch; register bool nega;	x = nega = 0;	for (ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) nega |= (ch == '-');	for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';	if (nega) x = -x;}class SegTree {PRivate:	struct SegTNode {		int l, r;		ll sum, tag;		SegTNode() {			sum = tag = 0;		}	}tr[100005 << 2];	#define mid ((l + r) >> 1)	void Build(cint &k, cint &l, cint &r) {		tr[k].l = l, tr[k].r = r;		if (l == r) return;		Build(k << 1, l, mid);		Build(k << 1 | 1, mid + 1, r);	}	inline void DownTag(cint &k) {		tr[k << 1].tag += tr[k].tag;		tr[k << 1].sum += tr[k].tag * (tr[k << 1].r - tr[k << 1].l + 1ll);		tr[k << 1 | 1].tag += tr[k].tag;		tr[k << 1 | 1].sum += tr[k].tag * (tr[k << 1 | 1].r - tr[k << 1 | 1].l + 1ll);		tr[k].tag = 0;	}	void Add(cint &k, cint &L, cint &R, cll &x) {		int l = tr[k].l, r = tr[k].r;		if (L <= l && r <= R) {			tr[k].tag += x;			tr[k].sum += x * (r - l + 1ll);			return;		}		if (tr[k].tag) DownTag(k);		if (L <= mid) Add(k << 1, L, R, x);		if (mid < R) Add(k << 1 | 1, L, R, x);		tr[k].sum = tr[k << 1].sum + tr[k << 1 | 1].sum;	}	ll Query(cint &k, cint &L, cint &R) {		int l = tr[k].l, r = tr[k].r;		if (L <= l && r <= R) return tr[k].sum;		if (tr[k].tag) DownTag(k);		ll ret = 0;		if (L <= mid) ret += Query(k << 1, L, R);		if (mid < R) ret += Query(k << 1 | 1, L, R);		return ret;	}	#undef midpublic:	inline void build(cint &l, cint &r) {		Build(1, l, r);	}	inline void add(cint &l, cint &r, cll &x) {		Add(1, l, r, x);	}	inline void add(cint &a, cll &x) {		Add(1, a, a, x);	}	inline ll query(cint &l, cint &r) {		return Query(1, l, r);	}}SegT;int n, m;int sz[100005], fa[100005], son[100005], top[100005], order[100005], tot = 0;std::vector<int> to[100005];#define next to[nowp][i]int DFS(cint &nowp) {	int tmp, maxson = 0; sz[nowp] = 1;	for (unsigned i = 0; i < to[nowp].size(); i++) {		if (next == fa[nowp]) continue;		fa[next] = nowp;		sz[nowp] += (tmp = DFS(next));		if (tmp > maxson) {			maxson = tmp; son[nowp] = next;		}	}	return sz[nowp];}void DFS2(cint &nowp, cint &Top) {	if (!nowp) return;	top[nowp] = Top; order[nowp] = ++tot;	DFS2(son[nowp], Top);	for (unsigned i = 0; i < to[nowp].size(); i++) {		if (next == fa[nowp] || next == son[nowp]) continue;		DFS2(next, next);	}}#undef nextinline ll Calc(int x) {	ll ret = 0;	while (top[x] != 1) {		ret += SegT.query(order[top[x]], order[x]);		x = fa[top[x]];	}	ret += SegT.query(1, order[x]);	return ret;}inline void Init() {	int u, v;	readln(n); readln(m);	ll w[n + 1];	for (int i = 1; i <= n; i++) readln(w[i]);	for (int i = 1; i < n; i++) {		readln(u); readln(v);		to[u].push_back(v);		to[v].push_back(u);	}	DFS(1);	DFS2(1, 1);	SegT.build(1, n);	for (int i = 1; i <= n; i++) SegT.add(order[i], w[i]);}inline void Solve() {	int opt, x; ll a;	while (m--) {		readln(opt); readln(x);		switch (opt) {			case 1:				readln(a);				SegT.add(order[x], a);				break;			case 2:				readln(a);				SegT.add(order[x], order[x] + sz[x] - 1, a);				break;			case 3:				printf("%I64d/n", Calc(x));		}	}}int main() {	Init(); Solve();		return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡山| 阳泉市| 禹城市| 葵青区| 高邑县| 抚州市| 永新县| 舞阳县| 桐梓县| 科尔| 永嘉县| 澄迈县| 南宁市| 滨州市| 汤原县| 且末县| 申扎县| 微山县| 平罗县| 曲阜市| 乐都县| 屏南县| 玉溪市| 武川县| 瓮安县| 来宾市| 巴中市| 临高县| 芜湖市| 灌云县| 沈丘县| 界首市| 资源县| 曲周县| 桂林市| 大关县| 那坡县| 洪泽县| 阿图什市| 运城市| 安乡县|