Untitled

 avatar
unknown
plain_text
5 days ago
2.0 kB
3
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;
}
Leave a Comment