Pagini recente » Cod sursa (job #1487017) | Arhiva de probleme, pregatire pentru concursuri de informatica | Cod sursa (job #2231505) | Cod sursa (job #2462752) | Cod sursa (job #1741965)
#include <bits/stdc++.h>
#define maxN 150002
#define maxK 320
#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 write()
{
freopen("arbore.out", "w", stdout);
k = 1 + (int)sqrt(n - 1);
while (m --)
{
int t, x, y, val, s;
scanf("%d", &t);
if (t == 1)
{
scanf("%d %d", &x, &s);
y = pos[x] + len[x] - 1;
x = pos[x];
val = s;
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 && p <= k; i += k)
{
isv[p].set(0, 0);
b[p] += val;
++ p;
}
if (p <= k)
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 && p <= k; i += k)
{
isv[p].set(0);
++ p;
}
if (p <= k)
for (; i <= p * k; ++ i)
isv[p].set(a[i]);
}
else
{
scanf("%d", &s);
int i, j, ok = 0;
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)
{
ok = 1;
printf("%d\n", rval[j]);
break;
}
}
if (!ok)
printf("-1\n");
}
}
}
int main()
{
read();
solve();
write();
return 0;
}