95 lines
1.8 KiB
C++
95 lines
1.8 KiB
C++
#include <algorithm>
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
#define let auto
|
|
#define fn auto
|
|
#define usize size_t
|
|
using namespace std;
|
|
|
|
struct Node {
|
|
usize acc;
|
|
usize self;
|
|
vector<Node *> *adjs;
|
|
|
|
void add_route(Node *node) {
|
|
adjs->push_back(node);
|
|
}
|
|
|
|
void update_delta(usize delta) {
|
|
acc += delta;
|
|
self += delta;
|
|
for (let x: *adjs) {
|
|
x->update_by_direct(delta);
|
|
}
|
|
}
|
|
|
|
void update_by_direct(usize delta) {
|
|
acc += delta;
|
|
}
|
|
};
|
|
|
|
fn fastio() {
|
|
ios::sync_with_stdio(false);
|
|
cin.tie(nullptr);
|
|
}
|
|
|
|
fn main() -> int {
|
|
fastio();
|
|
usize n, q;
|
|
cin >> n >> q;
|
|
let arr = (usize *) calloc(n, sizeof(usize));
|
|
|
|
let graph = (Node **) calloc(n, sizeof(Node *));
|
|
|
|
for (usize i = 0; i < n; i++) {
|
|
graph[i] = (Node *) malloc(sizeof(Node));
|
|
graph[i]->acc = 0;
|
|
graph[i]->self = 0;
|
|
graph[i]->adjs = new vector<Node *>();
|
|
}
|
|
|
|
for (usize i = 0; i < n; i++) {
|
|
usize a;
|
|
cin >> a;
|
|
arr[i] = a;
|
|
}
|
|
|
|
for (usize i = 0; i < n - 1; i++) {
|
|
usize u, v;
|
|
cin >> u >> v;
|
|
u = u - 1;
|
|
v = v - 1;
|
|
graph[u]->add_route(graph[v]);
|
|
graph[v]->add_route(graph[u]);
|
|
}
|
|
|
|
for (usize i = 0; i < n; i++) {
|
|
graph[i]->update_delta(arr[i]);
|
|
}
|
|
|
|
for (usize i = 0; i < q; i++) {
|
|
usize inst;
|
|
cin >> inst;
|
|
|
|
if (inst == 1) {
|
|
usize target, c;
|
|
cin >> target >> c;
|
|
target -= 1;
|
|
graph[target]->update_delta(c);
|
|
} else {
|
|
usize target;
|
|
cin >> target;
|
|
target -= 1;
|
|
cout << graph[target]->acc << '\n';
|
|
}
|
|
}
|
|
end:
|
|
|
|
free(arr);
|
|
for (usize i = 0; i < n; i++) {
|
|
delete graph[i]->adjs;
|
|
free(graph[i]);
|
|
}
|
|
free(graph);
|
|
} |