Cod sursa(job #1663227)

Utilizator SmarandaMaria Pandele Smaranda Data 25 martie 2016 17:42:01
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

const int N = 100010;

vector <int> graph [N];
int v [N], first [N], last [N], a [N], b [400];
bool c [400][N];
int lim, u;
bool used [N];

void dfs (int x) {
    vector <int> :: iterator it;

    used [x] = true;
    v [++ v [0]] = x;
    first [x] = v [0];
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        if (!used [*it])
            dfs (*it);
    last [x] = v [0];
}

void update (int l, int r, int s) {
    int i, j, st, dr;

    st = 1 - lim;
    dr = 0;
    for (i = 1; i <= u; i ++) {
        st = st + lim;
        dr = min (dr + lim, v [0]);
        if (st > v [0])
            break;
        if (l <= st && dr <= r) {
            b [i] = b [i] + s;
            continue;
        }
        if (st <= l && r <= dr) {
            for (j = l; j <= r; j ++) {
                c [i][a [j]] = 0;
                a [j] = a [j] + s;
            }
            for (j = st; j <= dr; j ++)
                c [i][a [j]] = 1;
            continue;
        }
        if (st <= l && l <= dr) {
            for (j = l; j <= dr; j ++) {
                c [i][a [j]] = 0;
                a [j] = a [j] + s;
            }
            for (j = st; j <= dr; j ++)
                c [i][a [j]] = 1;
            continue;
        }
        if (st <= r && r <= dr) {
            for (j = st; j <= r; j ++) {
                c [i][a [j]] = 0;
                a [j] = a [j] + s;
            }
            for (j = st; j <= dr; j ++)
                c [i][a [j]] = 1;
            continue;
        }
    }
}

void query (int s) {
    int i, k, st, dr, j;

    st = 1 - lim;
    dr = 0;
    for (i = 1; i <= u; i ++) {
        st = st + lim;
        dr = dr + lim;
        k = s - b [i];
        if (k >= 0)
            if (c [i][k] == 1) {
                for (j = st; j <= min (dr, v [0]); j ++)
                    if (a [j] == k) {
                        printf ("%d\n", v [j]);
                        return;
                    }
            }
    }
    printf ("-1\n");
}

int main () {
    int i, n, x, y, m, type, s;

    freopen ("arbore.in", "r", stdin);
    freopen ("arbore.out", "w", stdout);

    scanf ("%d%d", &n, &m);
    lim = sqrt (n);
    u = n / lim;
    if (n % lim)
        u ++;
    for (i = 1; i <= u; i ++)
        c [i][0] = true;
    for (i = 1; i < n; i ++) {
        scanf ("%d%d", &x, &y);
        graph [x].push_back (y);
        graph [y].push_back (x);
    }
    dfs (1);
    for (i = 1; i <= m; i ++) {
        scanf ("%d", &type);
        if (type == 1) {
            scanf ("%d%d", &x, &s);
            update (first [x], last [x], s);
        }
        else {
            scanf ("%d", &s);
            query (s);
        }
    }
    return 0;
}