Untitled
#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; }
Leave a Comment