Cod sursa(job #1741654)

Utilizator akaprosAna Kapros akapros Data 14 august 2016 17:30:57
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <bits/stdc++.h>
#define maxN 100002
#define maxK 318
#define maxV 1000002
using namespace std;
int n, m, k, pos[maxN], p[maxN], e, len[maxN], rval[maxN];
vector < int > V[maxN];
bitset < maxK > isv[maxV];
int a[maxN], b[maxK];
void read()
{
    int i;
    freopen("arbore.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for (i = 1; i < n; ++ i)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        if (p[y])
            swap(x, y);
        p[y] = x;
        V[x].push_back(y);
    }
}
void dfs(int x)
{
    int i, nod, l = V[x].size();
    len[x] = 1;
    pos[x] = ++ e;
    rval[e] = x;
    for (i = 0; i < l; ++ i)
        if (!pos[nod = V[x][i]])
        {
            dfs(nod);
            len[x] += len[nod];
        }
}
void solve()
{
    int i, r = 0;
    for (i = 1; i <= n; ++ i)
        if (!p[i])
        {
            r = i;
            break;
        }
    dfs(r);
}
void update(int x, int y, int val)
{
    int i, p = (x - 1) / k;
    for (i = x; i <= p * k; ++ i)
    {
        isv[p].set(a[i] + b[p], 0);
        a[i] += val;
    }
    for (; i + k - 1 <= y; i += k)
    {
        ++ p;
        isv[p].set(b[p], 0);
        b[p] += val;
    }
    for (; i <= y; ++ i)
    {
        isv[p + 1].set(a[i] + b[p + 1], 0);
        a[i] += val;
    }

    p = (x - 1) / k;
    for (i = (p - 1) * k + 1; i <= p * k; ++ i)
        isv[p].set(a[i] + b[p]);
    for (; i + k - 1 <= y; i += k)
    {
        ++ p;
        isv[p].set(b[p]);
    }
    for (; i <= (p + 1) * k; ++ i)
        isv[p + 1].set(a[i] + b[p + 1]);
}
int query(int s)
{
    int i, j;
    for (i = 1; i <= k; ++ i)
        if (isv[i][s])
        {
            for (j = (i - 1) * k + 1; j <= i * k; ++ j)
                if (a[j] + b[i] == s)
                    return rval[j];
        }
    return -1;
}
void write()
{
    freopen("arbore.out", "w", stdout);
    k = 1 + (int)(sqrt(n + 1));
    while (m --)
    {
        int t, x, s;
        scanf("%d", &t);
        if (t == 1)
        {
            scanf("%d %d", &x, &s);
            update(pos[x], pos[x] + len[x] - 1, s);
        }
        else
        {
            scanf("%d", &s);
            printf("%d\n", query(s));
        }
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}