Cod sursa(job #2224910)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 25 iulie 2018 15:24:12
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
// stiu ca nu intra in timp ca parcurg la query uri tot arborele ca sa afisez (-1)
// da is curios sa vad cat ia
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

ifstream f ("arbore.in");
ofstream g ("arbore.out");

const int NMAX = 1e5 + 5;
int v[NMAX], leftEnd[NMAX], rightEnd[NMAX];
int n, m, ind;
vi adj[NMAX];
struct Node {
    int sumMax, sum;
    Node () {
        sumMax = sum = 0;
    }
} segmTree[4 * NMAX];

void dfs (int node, int dad) {
    v[ind++] = node;
    leftEnd[node] = ind - 1;
    for (auto &i : adj[node]) {
        if (i != dad)
            dfs (i, node);
    }
    rightEnd[node] = ind - 1;
}

void update (int node, int left, int right, int x, int y, int val) {
    if (x <= left && right <= y) {
        segmTree[node].sum += val;
        segmTree[node].sumMax = segmTree[node].sum + max (segmTree[2 * node + 1].sumMax, segmTree[2 * node + 2].sumMax);
        return;
    }
    int mid = left + (right - left) / 2;
    if (x <= mid) {
        update (2 * node + 1, left, mid, x, y, val);
    }
    if (y > mid) {
        update (2 * node + 2, mid + 1, right, x, y, val);
    }
    segmTree[node].sumMax = segmTree[node].sum + max (segmTree[2 * node + 1].sumMax, segmTree[2 * node + 2].sumMax);
}

int query (int node, int left, int right, int val) {
    if (segmTree[node].sum == val) return v[left];
    if (left == right) {
        return -1;
    }
    int mid = left + (right - left) / 2;
    int ret = -1;
    if (val < segmTree[node].sum) return -1;
    if (segmTree[2 * node + 1].sumMax + segmTree[node].sum >= val) {
        ret = query (2 * node + 1, left, mid, val - segmTree[node].sum);
    }
    if (ret != -1) return ret;
    if (segmTree[2 * node + 2].sumMax + segmTree[node].sum >= val) {
        ret = query (2 * node + 2, mid + 1, right, val - segmTree[node].sum);
    }
    return ret;
}

int main() {
    f >> n >> m;
    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        f >> u >> v;
        --u; --v;
        adj[u].pb (v);
        adj[v].pb (u);
    }
    dfs (0, -1);
    while (m--) {
        int type, node, sum;
        f >> type;
        if (type - 1) {
            f >> sum;
            g << 1 + query (0, 0, n - 1, sum) << '\n';
        } else {
            f >> node >> sum;
            --node;
            update (0, 0, n - 1, leftEnd[node], rightEnd[node], sum);
        }
    }

    f.close();
    g.close();
    return 0;
}