Pagini recente » Profil Caracatita_09 | Cod sursa (job #3201717) | Cod sursa (job #1133080)
#include <iostream>
#include <fstream>
#include <cmath>
#include <bitset>
#include <vector>
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
const int MAXN = 100100;
const int MAXS = 1000100;
const int MAXLIM = 350;
int n, q, p, lim, bucket_sum[MAXLIM], elem[MAXN], start[MAXN], last[MAXN], pos_to_nod[MAXN];
bitset<MAXS> in_bucket[MAXLIM];
vector<int> graf[MAXN];
void dfs (int nod, int dad) {
start[nod] = ++p;
pos_to_nod[p] = nod;
for (int i = 0; i < (int)graf[nod].size(); ++i) {
int node = graf[nod][i];
if (node != dad)
dfs (node, nod);
}
last[nod] = p;
}
void update_bucket (int bucket, int start, int last, int s) {
int st = max (start, bucket * lim + 1);
int dr = min (last, (bucket + 1) * lim);
for (int i = st; i <= dr; ++i)
elem[i] += s;
in_bucket[bucket].reset();
for (int i = bucket * lim + 1; i <= (bucket + 1) * lim; ++i)
in_bucket[bucket][elem[i]] = 1;
}
void update (int start, int last, int s) {
for (int i = 0; i < lim; ++i) {
if (start <= i * lim + 1 && last >= (i + 1) * lim)
bucket_sum[i] += s;
}
for (int i = 0; i < lim; ++i) {
if (last >= i * lim + 1 && last < (i + 1) * lim)
update_bucket (i, start, last, s);
else if (start > i * lim + 1 && start <= (i + 1) * lim)
update_bucket (i, start, last, s);
}
}
int query (int s) {
int bucket;
for (bucket = 0; bucket < lim; ++bucket)
if (bucket_sum[bucket] <= s && in_bucket[bucket][s - bucket_sum[bucket]]) break;
if (bucket >= lim) return -1;
s -= bucket_sum[bucket];
for (int i = bucket * lim + 1; i <= (bucket + 1) * lim; ++i)
if (elem[i] == s)
return pos_to_nod[i];
return -1;
}
int main() {
fin >> n >> q;
lim = sqrt(n) + 1;
for (int i = 1; i < n; ++i) {
int a, b; fin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
dfs (1, 0);
for (int i = 0; i < lim; ++i)
in_bucket[i][0] = 1;
for (int i = 1; i <= q; ++i) {
int type; fin >> type;
if (type == 1) {
int nod, s; fin >> nod >> s;
update (start[nod], last[nod], s);
}
else {
int s; fin >> s;
fout << query(s) << "\n";
}
}
return 0;
}