Pagini recente » Cod sursa (job #2519789) | Cod sursa (job #2782276) | Cod sursa (job #1832698) | Cod sursa (job #2269355) | Cod sursa (job #1663227)
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
const int N = 100010;
vector <int> graph [N];
int v [N], first [N], last [N], a [N], b [400];
bool c [400][N];
int lim, u;
bool used [N];
void dfs (int x) {
vector <int> :: iterator it;
used [x] = true;
v [++ v [0]] = x;
first [x] = v [0];
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
if (!used [*it])
dfs (*it);
last [x] = v [0];
}
void update (int l, int r, int s) {
int i, j, st, dr;
st = 1 - lim;
dr = 0;
for (i = 1; i <= u; i ++) {
st = st + lim;
dr = min (dr + lim, v [0]);
if (st > v [0])
break;
if (l <= st && dr <= r) {
b [i] = b [i] + s;
continue;
}
if (st <= l && r <= dr) {
for (j = l; j <= r; j ++) {
c [i][a [j]] = 0;
a [j] = a [j] + s;
}
for (j = st; j <= dr; j ++)
c [i][a [j]] = 1;
continue;
}
if (st <= l && l <= dr) {
for (j = l; j <= dr; j ++) {
c [i][a [j]] = 0;
a [j] = a [j] + s;
}
for (j = st; j <= dr; j ++)
c [i][a [j]] = 1;
continue;
}
if (st <= r && r <= dr) {
for (j = st; j <= r; j ++) {
c [i][a [j]] = 0;
a [j] = a [j] + s;
}
for (j = st; j <= dr; j ++)
c [i][a [j]] = 1;
continue;
}
}
}
void query (int s) {
int i, k, st, dr, j;
st = 1 - lim;
dr = 0;
for (i = 1; i <= u; i ++) {
st = st + lim;
dr = dr + lim;
k = s - b [i];
if (k >= 0)
if (c [i][k] == 1) {
for (j = st; j <= min (dr, v [0]); j ++)
if (a [j] == k) {
printf ("%d\n", v [j]);
return;
}
}
}
printf ("-1\n");
}
int main () {
int i, n, x, y, m, type, s;
freopen ("arbore.in", "r", stdin);
freopen ("arbore.out", "w", stdout);
scanf ("%d%d", &n, &m);
lim = sqrt (n);
u = n / lim;
if (n % lim)
u ++;
for (i = 1; i <= u; i ++)
c [i][0] = true;
for (i = 1; i < n; i ++) {
scanf ("%d%d", &x, &y);
graph [x].push_back (y);
graph [y].push_back (x);
}
dfs (1);
for (i = 1; i <= m; i ++) {
scanf ("%d", &type);
if (type == 1) {
scanf ("%d%d", &x, &s);
update (first [x], last [x], s);
}
else {
scanf ("%d", &s);
query (s);
}
}
return 0;
}