Pagini recente » Cod sursa (job #1647047) | Cod sursa (job #1181630) | Cod sursa (job #264579) | Cod sursa (job #1581720) | Cod sursa (job #1741949)
#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;
}
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 <= i * k && j <= n; ++ 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));
exit(0);
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;
}