Pagini recente » Cod sursa (job #1419619) | Cod sursa (job #2523640) | Cod sursa (job #2442468) | Cod sursa (job #1424954) | Cod sursa (job #2914528)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
const int maxv = 1e6+10;
const int bucket = 320;
int n, m;
int st[maxn], en[maxn], vert[maxn], tt = -1;
int a[maxn];
int soma[maxn];
vector<int> grafo[maxn];
bitset<maxv> existe[bucket];
void dfs(int u, int p)
{
st[u] = ++tt;
vert[tt] = u;
for (auto v: grafo[u])
if (v != p)
dfs(v, u);
en[u] = tt;
}
int main(void)
{
FILE *fin = fopen("arbore.in", "r");
FILE *fout = fopen("arbore.out", "w");
fscanf(fin, "%d %d", &n, &m);
for (int i = 1; i < n; i++)
{
int u, v;
fscanf(fin, "%d %d", &u, &v);
grafo[u].push_back(v); grafo[v].push_back(u);
}
dfs(1, 0);
for (int i = 0; i < n; i++)
existe[i/bucket][0] = 1;
for (int i = 1; i <= m; i++)
{
int op;
fscanf(fin, "%d", &op);
if (op == 1)
{
int u, v;
fscanf(fin, "%d %d", &u, &v);
int l = st[u], r = en[u];
int p = l/bucket, k = r/bucket;
if (p == k)
{
for (int i = l; i <= r; i++)
existe[p][a[i]] = 0;
for (int i = p*bucket; i < min(n, (p+1)*bucket); i++)
if (i < l || i > r)
existe[p][a[i]] = 1;
for (int i = l; i <= r; i++)
{
a[i] += v;
existe[p][a[i]] = 1;
}
}
else
{
for (int i = p+1; i < k; i++)
soma[i] += v;
for (int i = l; i < min(n, (p+1)*bucket); i++)
existe[p][a[i]] = 0;
for (int i = k*bucket; i <= r; i++)
existe[k][a[i]] = 0;
for (int i = p*bucket; i < l; i++)
existe[p][a[i]] = 1;
for (int i = r+1; i < min(n, (k+1)*bucket); i++)
existe[k][a[i]] = 1;
for (int i = l; i < min(n, (p+1)*bucket); i++)
{
a[i] += v;
existe[p][a[i]] = 1;
}
for (int i = k*bucket; i <= r; i++)
{
a[i] += v;
existe[k][a[i]] = 1;
}
}
}
else
{
int v;
fscanf(fin, "%d", &v);
bool ok = 0;
for (int i = 0; i <= (n-1)/bucket; i++)
{
if (ok) break;
if (v >= soma[i] && existe[i][v-soma[i]])
{
ok = 1;
for (int j = i*bucket; j < min(n, (i+1)*bucket); j++)
{
if (a[j]+soma[i] == v)
{
fprintf(fout, "%d\n", vert[j]);
break;
}
}
}
}
if (!ok)
fprintf(fout, "-1\n");
}
}
return 0;
}