Pagini recente » Cod sursa (job #767307) | Cod sursa (job #2384137) | Cod sursa (job #336263) | Cod sursa (job #589963) | Cod sursa (job #1747724)
#include <fstream>
#include <algorithm>
#include <bitset>
using namespace std;
const int kMaxN = 100005;
const int kMaxB = sqrt(kMaxN);
const int kStep = sqrt(kMaxN);
const int kMaxVal = 1000005;
int n, m;
vector<int> graph[kMaxN];
int order[kMaxN];
int time_in[kMaxN];
int time_out[kMaxN];
int current[kMaxN];
int add[kMaxB];
bitset<kMaxVal> exists[kMaxB];
inline int BucketBegin(int i) { return (i - 1) * kStep + 1; }
inline int BucketEnd(int i) { return min(n, i * kStep); }
inline int BucketId(int i) { return (i - 1) / kStep + 1; }
void Dfs(int x, int p) {
++order[0];
order[order[0]] = x;
time_in[x] = order[0];
for(auto y : graph[x]) {
if(y != p) {
Dfs(y, x);
}
}
time_out[x] = order[0];
}
void Update(int l, int r, int s) {
int id_l = BucketId(l), id_r = BucketId(r);
if(id_l == id_r) {
for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 0;
for(int i = l; i <= r; i++) current[i] += s;
for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 1;
return;
}
for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 0;
for(int i = l; i <= BucketEnd(id_l); i++) current[i] += s;
for(int i = BucketBegin(id_l); i <= BucketEnd(id_l); i++) exists[id_l][current[i]] = 1;
for(int i = BucketBegin(id_r); i <= BucketEnd(id_r); i++) exists[id_r][current[i]] = 0;
for(int i = BucketBegin(id_r); i < r; i++) current[i] += s;
for(int i = BucketBegin(id_r); i <= BucketEnd(id_r); i++) exists[id_r][current[i]] = 1;
for(int i = id_l + 1; i <= id_r - 1; i++) add[i] += s;
}
int Query(int s) {
for(int i = 1; i <= BucketId(n); i++) {
if(add[i] <= s && exists[i][s - add[i]]) {
for(int j = BucketBegin(i); j <= BucketEnd(i); j++) {
if(current[j] + add[i] == s) {
return order[j];
}
}
}
}
return -1;
}
int main() {
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i < n; i++) {
int x, y;
scanf("%d %d", &x, &y);
graph[x].push_back(y);
graph[y].push_back(x);
}
Dfs(1, 0);
while(m--) {
int op, x, s;
scanf("%d", &op);
if(op == 1) {
scanf("%d %d", &x, &s);
Update(time_in[x], time_out[x], s);
} else {
scanf("%d", &s);
printf("%d\n", Query(s));
}
}
return 0;
}