Pagini recente » Cod sursa (job #1573557) | Cod sursa (job #1504417) | Cod sursa (job #2837142) | Cod sursa (job #1446433) | Cod sursa (job #1568202)
#include <fstream>
#include <vector>
#include <cmath>
#include <bitset>
#define DIM 100010
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
int n, m, root;
vector<int> L[DIM];
int position;
int parc[DIM], start[DIM], finish[DIM];
bool vis[DIM];
int v[DIM], add[350];
bitset<1000010> ok[350];
void DFS(int node) {
vis[node] = true;
parc[++position] = node;
start[node] = position;
for (int i = 0; i < L[node].size(); i++) {
int child = L[node][i];
if (!vis[child])
DFS(child);
}
finish[node] = position;
}
void update(int node, int sum) {
int Start = start[node];
int Finish = finish[node];
int SR = (Start - 1) / root + 1;
int SF = (Finish - 1) / root + 1;
if ((SR - 1) * root + 1 < Start) {
for (int i = (SR - 1) * root + 1; i <= SR * root; i++)
ok[SR][v[i]] = 0;
for (int i = (SR - 1) * root + 1; i <= SR * root; i++) {
v[i] += add[SR];
if (i >= Start)
v[i] += sum;
if (i <= n)
ok[SR][v[i]] = 1;
}
add[SR] = 0;
SR++;
}
if (SF * root > Finish) {
for (int i = (SF - 1) * root + 1; i <= SF * root; i++)
ok[SF][v[i]] = 0;
for (int i = (SF - 1) * root + 1; i <= SF * root; i++) {
v[i] += add[SF];
if (i <= Finish)
v[i] += sum;
if (i <= n)
ok[SF][v[i]] = 1;
}
add[SF] = 0;
SF--;
}
for (int i = SR; i <= SF; i++)
add[i] += sum;
}
int query(int sum) {
for (int i = 1; i <= root; i++) {
if (sum - add[i] < 0)
continue;
if (ok[i][sum - add[i]])
for (int j = (i - 1) * root + 1; j <= i * root; j++)
if (v[j] + add[i] == sum)
return parc[j];
}
return -1;
}
int main() {
fin >> n >> m;
root = sqrt(n * 1.0);
for (int i = 1; i <= root; i++)
ok[i][0] = 1;
for (int i = 1; i < n; i++) {
int x, y;
fin >> x >> y;
L[x].push_back(y);
L[y].push_back(x);
}
DFS(1);
while (m--) {
int op;
fin >> op;
if (op == 1) {
int node, sum;
fin >> node >> sum;
update(node, sum);
continue;
}
int sum;
fin >> sum;
fout << query(sum) << "\n";
}
return 0;
}
//Miriam e tare!