Cod sursa(job #3334728)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 19 ianuarie 2026 12:31:28
Problema Arbore Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <bits/stdc++.h>

using namespace std;
const int NRB = 317;
const int MAXN = 100000;
int vin[MAXN + 1], vout[MAXN + 1], ord[MAXN], par[MAXN + 1], vlazy[NRB], v[MAXN];
unordered_map<int, int> fr[NRB];
vector<int> adj[MAXN + 1];
int time1;

void dfs(int nod) {
    int nr, i, x;
    time1++;
    vin[nod] = time1;
    ord[time1] = nod;
    nr = adj[nod].size();
    for (i = 0; i < nr; i++) {
        x = adj[nod][i];
        if (par[x] < 0) {
            par[x] = nod;
            dfs(x);
        }
    }
    vout[nod] = time1;
}
void add(int x, int s, int nb) {//poz, suma, bucket
    fr[nb][v[x]]--;
    if (fr[nb][v[x]] == 0) {
        fr[nb].erase(v[x]);
    }
    v[x] += s;
    fr[nb][v[x]]++;
}
int minim(int a, int b) {
    return a < b ? a : b;
}
int maxim(int a, int b) {
    return a > b ? a : b;
}
int main()
{
    FILE *fin, *fout;
    //cu sqrt decomp si tin lazy pe un bucket cu cat am adunat
    //si daca trebuie x si am adunat y pe bucket vad daca exista in el un x - y
    int n, q, i, x, y, st, dr, p, s, b, nrb, j, cer, c, rez, i1;
    fin = fopen("arbore.in", "r");
    fscanf(fin, "%d%d", &n, &q);
    for (i = 0; i < n - 1; i++) {
        fscanf(fin, "%d%d", &x, &y);
        adj[x].push_back(y);
        adj[y].push_back(x);
        par[i + 2] = -1;
    }
    time1 = -1;
    dfs(1);
    b = sqrt(n);
    nrb = 0;
    i = 0;
    while (i < n) {
        j = i + b;
        if (j > n) {
            j = n;
        }
        fr[nrb][0] += (j - i);
        nrb++;
        i = j;
    }
    fout = fopen("arbore.out", "w");
    for (i1 = 0; i1 < q; i1++) {
        fscanf(fin, "%d", &cer);
        if (cer == 1) {
            fscanf(fin, "%d%d", &p, &s);
            st = vin[p];
            dr = vout[p];
            x = (st / b);
            y = (dr / b);
            if (x == y) {
                for (j = st; j <= dr; j++) {
                    add(j, s, x);
                }
            } else {
                c = minim((x + 1) * b, n);
                for (j = st; j < c; j++) {
                    add(j, s, x);
                }
                for (j = dr; j >= y * b; j--) {
                    add(j, s, y);
                }
                for (x++; x < y; x++) {
                    //adaug lazy s pe interval
                    vlazy[x] += s;
                }
            }
        } else {
            fscanf(fin, "%d", &s);
            x = i = rez = 0;
            while (i < n && rez == 0) {
                if (fr[x].count(s - vlazy[x]) > 0) {
                    j = i;
                    while (v[j] != s - vlazy[x]) {
                        j++;
                    }
                    fprintf(fout, "%d\n", ord[j]);
                    rez = 1;
                }
                i += b;
                x++;
            }
            if (rez == 0) {
                fprintf(fout, "-1\n");
            }
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}