Pagini recente » Cod sursa (job #1452429) | Cod sursa (job #2955951) | Cod sursa (job #1156858) | Cod sursa (job #2877835) | Cod sursa (job #931563)
Cod sursa(job #931563)
#include <iostream>
#include <cstdio>
#include <bitset>
#include <vector>
#define SQRT_MAX 330
#define MAX 100005
using namespace std;
int N, M, K, NR;
int First[MAX], Last[MAX], V[MAX], Start[SQRT_MAX], Stop[SQRT_MAX], ap[MAX], sum[SQRT_MAX], val[MAX];
vector<int> G[MAX];
bitset<MAX> P[SQRT_MAX];
void citire() {
freopen("arbore.in", "r", stdin); freopen("arbore.out", "w", stdout);
cin>>N>>M;
for(int i = 1, A, B; i < N; i++) {
cin>>A>>B;
G[A].push_back(B);
G[B].push_back(A);
}
}
void dfs(const int &nod, const int &dad) {
V[++K] = nod;
First[nod] = K;
for(size_t i = 0; i < G[nod].size(); i++) {
int dest = G[nod][i];
if(dest == dad) continue;
dfs(dest, nod);
} Last[nod] = K;
}
void createLists() {
int S;
for(S = 1; S * S <= N; S++);
S--;
for(int i = 1, region = 0; i <= N; i++) {
if(i % S == 1) {
Stop[region++] = i - 1;
P[region][0] = 1;
Start[region] = i;
NR = region;
}
ap[i] = region;
} Stop[NR] = N;
}
inline void Update(const int &L, const int &R, const int &S) {
for(int i = ap[L]; i <= ap[R]; i++) {
if(L <= Start[i] && Stop[i] <= R) {
sum[i] += S;
continue;
}
for(int j = Start[i]; j <= Stop[i]; j++) {
P[i][val[j]] = 0;
val[j] = sum[i] + (L <= j && j <= R ? S : 0);
} sum[i] = 0;
for(int j = Start[i]; j <= Stop[i]; j++)
P[i][val[j]] = true;
}
}
inline int Query(const int &S) {
for(int i = 1; i <= NR; i++) {
if(sum[i] > S) continue;
if(P[i][S - sum[i]]) {
for(int j = Start[i]; j <= Stop[i]; j++)
if(val[j] == S - sum[i])
return V[j];
}
} return -1;
}
void solve() {
dfs(1, 0);
createLists();
for(int i = 1, T, P, S; i <= M; i++) {
cin>>T;
switch(T) {
case 1: cin>>P>>S; Update(First[P], Last[P], S); break;
case 2: cin>>S; cout<<Query(S)<<"\n"; break;
}
} fclose(stdin); fclose(stdout);
}
int main() {
citire();
solve();
return 0;
}