Untitled
unknown
plain_text
9 months ago
2.0 kB
6
Indexable
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
const int N = 1e5 + 5;
int in[N], out[N];
int timer = 0;
vector<pair<int,int>>queries;
vector<long long>inc(N), ans(N);
vector<int>euler[N];
void flat(int node, vector<int>adj[], int parent = 0, int len = 0){
in[node] = timer;
euler[len].emplace_back(timer++);
for (int child : adj[node]){
if (child == parent)
continue;
flat(child, adj, node, len + 1);
}
out[node] = timer++;
}
void dfs(int node, vector<int>adj[], int parent = 0, int len = 0){
ans[node] = inc[len];
for (int &child : adj[node]){
if (child == parent)
continue;
dfs(child, adj, node, len + 1);
ans[node] += ans[child];
}
}
void solve(){
int n, q; cin >> n >> q;
vector<int>adj[n];
for (int i = 1; i < n; ++i){
int u, v; cin >> u >> v;
--u, --v;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
flat(0, adj);
int val = sqrt(n);
while(q--){
if (queries.size() > val){
dfs(0, adj);
queries.clear();
}
int type; cin >> type;
if (type == 1){
int l, y; cin >> l >> y;
queries.emplace_back(make_pair(l ,y));
inc[l] += y;
}
else{
int node; cin >> node;
--node;
long long so_far = 0;
for (auto &[l, y] : queries){
int x = upper_bound(euler[l].begin(), euler[l].end(), out[node]) - lower_bound(euler[l].begin(), euler[l].end(), in[node]);
so_far += 1LL * x * y;
}
cout << ans[node] + so_far << '\n';
}
}
}
int main()
{
fast;
int t = 1; //cin >> t;
for (int i = 1 ; i <= t; ++i){
solve();
if (i != t)
cout << '\n';
}
return 0;
}Editor is loading...
Leave a Comment