Pagini recente » Cod sursa (job #1271982) | Cod sursa (job #2557791) | Cod sursa (job #2482420) | Cod sursa (job #2208833) | Cod sursa (job #2398932)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
const int MAXV = 1e6;
const int BUCK = 8;
class instream {
public:
static const int BUFF_SIZE = 1 << 17;
FILE *fin;
int bp;
char buff[BUFF_SIZE];
instream (const char *file) {
bp = BUFF_SIZE - 1;
fin = fopen(file, "r");
}
inline void close() {
fclose(fin);
}
inline void adv() {
if (++bp == BUFF_SIZE) {
fread(buff, sizeof(char), BUFF_SIZE, fin);
bp = 0;
}
}
instream& operator >> (int& num) {
num = 0;
while (isdigit(buff[bp]) == false)
adv();
while (isdigit(buff[bp]) == true) {
num = num * 10 + buff[bp] - '0';
adv();
}
return *this;
}
};
vector < int > g[MAXN + 1];
int v[MAXN + 1], frst[MAXN + 1], lst[MAXN + 1], wh_node[MAXN + 1], lazy[(MAXN >> BUCK) + 2], sb[(MAXN >> BUCK) + 2], eb[(MAXN >> BUCK) + 2], indx, n, num_b;
bitset < MAXV + 1 > freq[(MAXN >> BUCK) + 2];
void dfs(int node, int father = 0) {
wh_node[++indx] = node;
frst[node] = indx;
for (auto it : g[node])
if (it ^ father)
dfs(it, node);
lst[node] = indx;
}
inline void update(int l, int r, int val) {
int b = ((l - 1) >> BUCK) + 1;
for (int i = sb[b]; i <= eb[b]; ++i)
freq[b][v[i]] = 0;
for (int i = l; i <= r && i <= eb[b]; ++i)
v[i] += val;
for (int i = sb[b]; i <= eb[b]; ++i)
freq[b][v[i]] = 1;
if (b == ((r - 1) >> BUCK) + 1)
return;
for (b = b + 1; eb[b] <= r; ++b)
lazy[b] += val;
for (int i = sb[b]; i <= eb[b]; ++i)
freq[b][v[i]] = 0;
for (int i = sb[b]; i <= r; ++i)
v[i] += val;
for (int i = sb[b]; i <= eb[b]; ++i)
freq[b][v[i]] = 1;
}
inline int query(int val) {
int b;
for (b = 1; eb[b] <= n; ++b)
if (val >= lazy[b] && freq[b][val - lazy[b]])
for (int i = sb[b]; i <= eb[b]; ++i)
if (v[i] + lazy[b] == val)
return wh_node[i];
return -1;
}
int main()
{
int m;
instream fin("arbore.in");
fin >> n >> m;
for (int i = 1; i < n; ++i) {
int x, y;
fin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
num_b = 0;
do {
freq[++num_b][0] = 1;
sb[num_b] = ((num_b - 1) << BUCK) + 1;
eb[num_b] = (num_b << BUCK);
} while (eb[num_b] < n);
eb[num_b] = n; sb[num_b + 1] = eb[num_b + 1] = n + 1;
ofstream fout("arbore.out");
for (int i = 0; i < m; ++i) {
int type, x, y;
fin >> type;
if (type == 1) {
fin >> x >> y;
update(frst[x], lst[x], y);
} else {
fin >> x;
fout << query(x) << '\n';
}
}
fin.close();
fout.close();
return 0;
}