Cod sursa(job #1741959)

Utilizator akaprosAna Kapros akapros Data 15 august 2016 15:42:10
Problema Arbore Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>
#define maxN 150002
#define maxK 318
#define maxV 1500002
using namespace std;
int n, m, k, pos[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);
        V[y].push_back(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()
{
    dfs(1);
}
void update(int x, int y, int val)
{
    int i, p = (x - 1) / k + 1;
    if (x != (p - 1) * k + 1)
    {
        for (i = x; i <= p * k && i <= y; ++ i)
        {
            isv[p].set(a[i], 0);
            a[i] += val;
        }
        ++ p;
    }
    else
        i = x;
    for (; i + k - 1 <= y; i += k)
    {
        isv[p].set(0, 0);
        b[p] += val;
        ++ p;
    }
    for (; i <= y; ++ i)
    {
        isv[p].set(a[i], 0);
        a[i] += val;
    }

    p = (x - 1) / k + 1;
    for (i = (p - 1) * k + 1; i <= p * k; ++ i)
        isv[p].set(a[i]);
    ++ p;
    for (; i + k - 1 <= y; i += k)
    {
        isv[p].set(0);
        ++ p;
    }
    if (p > k)
        while (1);
    for (; i <= p * k; ++ i)
        isv[p].set(a[i]);
}
int query(int s)
{
    int i, j;
    for (i = 1; i <= k; ++ i)
        if (s >= b[i] && isv[i][s - b[i]])
        {
            for (j = (i - 1) * k + 1; j <= n && 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;
}