Pagini recente » Cod sursa (job #2665355) | Cod sursa (job #2359675) | Cod sursa (job #239623) | Cod sursa (job #2392198) | Cod sursa (job #2953964)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "arbore.in" );
ofstream fout( "arbore.out" );
const int DIM = 1e5 + 5;
const int BK = 320;
const int MAXS = 1e6 + 5;
vector<int> T[DIM];
int pre[DIM], sum[DIM], lazy[BK];
pair<int, int> range[DIM];
int idx = -1, len;
bitset<MAXS> f[BK];
void dfs( int u, int p ) {
range[u].first = ++idx;
pre[idx] = u;
for ( auto v : T[u] ) {
if ( v != p ) {
dfs(v, u);
}
}
range[u].second = idx;
}
void updateRange( int l, int r, int bk, int add ) {
int ll = bk * len, rr = min((bk + 1) * len - 1, idx - 1);
for ( int i = ll; i <= rr; ++i ) f[bk][sum[i]] = 0;
for ( int i = l; i <= r; ++i ) sum[i] += add;
for ( int i = ll; i <= rr; ++i ) f[bk][sum[i]] = 1;
}
void update( int l, int r, int add ) {
int bk1 = l / len, bk2 = r / len;
if ( bk1 == bk2 ) {
updateRange( l, r, bk1, add );
return;
}
updateRange( l, (bk1 + 1) * len - 1, bk1, add );
updateRange( bk2 * len, r, bk2, add );
for ( ++bk1; bk1 < bk2; ++bk1 ) lazy[bk1] += add;
}
int main() {
int n, m, t, u, v;
fin >> n >> m;
for ( int i = 1; i < n; ++i ) {
fin >> u >> v;
T[u].push_back(v);
T[v].push_back(u);
}
len = sqrt(n);
dfs(1, 0);
++idx;
int nb = idx / len;
for ( int b = 0; b <= nb; ++b ) {
f[b][0] = 1;
}
while ( m-- ) {
fin >> t >> u;
if ( t == 1 ) {
fin >> v;
update(range[u].first, range[u].second, v);
} else {
bool ok = false;
for ( int b = 0; b <= nb && !ok; ++b ) {
if ( u >= lazy[b] && f[b][u - lazy[b]] ) {
int lst = min((b + 1) * len, idx), node = 0;
for ( int i = b * len; i < lst && node == 0; ++i ) {
if ( sum[i] + lazy[b] == u ) {
node = pre[i];
}
}
ok = true;
fout << node << "\n";
}
}
if ( !ok ) {
fout << "-1\n";
}
}
}
fin.close();
fout.close();
return 0;
}