Pagini recente » Cod sursa (job #466282) | Cod sursa (job #3130497) | Cod sursa (job #2888776) | Cod sursa (job #315458) | Cod sursa (job #2654761)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <cmath>
using namespace std;
ifstream si("arbore.in");
ofstream so("arbore.out");
vector<int> g[100005];
bitset<1000005> b[325];
int k;
int first[100005], last[100005];
int e[100005], el[100005];
int start[325], stop[325], val[325];
bool viz[100005];
int nr;
void dfs(int nod) {
viz[nod]=1;
++k;
first[nod]=k;
el[k]=nod;
for(int i=0; i<g[nod].size(); ++i)
if(!viz[g[nod][i]])
dfs(g[nod][i]);
last[nod]=k;
}
void update(int f, int l, int value) {
for(int i=1; i<=nr; i++) {
if(f<=start[i]&&stop[i]<=l)
val[i]+=value;
else if (f>start[i]&&stop[i]>l)
for(int j=f; j<=l; j++) {
e[j]+=value;
b[i][e[j]]=1;
}
else if(f>start[i]&&f<=stop[i])
for (int j=f; j<=stop[i]; j++) {
e[j]+=value;
b[i][e[j]]=1;
}
else if(stop[i]>l&&l>=start[i])
for(int j=start[i]; j<=l; j++) {
e[j]+=value;
b[i][e[j]]=1;
}
}
}
int query(int s) {
for(int i=1; i<=nr; i++) {
if(s-val[i]<0)
continue;
if(b[i][s-val[i]])
for(int j=start[i]; j<=stop[i]; j++)
if(e[j]==s-val[i])
return el[j];
}
return -1;
}
int main() {
int n, m;
si>>n>>m;
for(int i=1; i<n; i++){
int x, y;
si>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
int r=sqrt(n);
for(int i=1; i<=n; i++){
if(i%r==1){
stop[nr]=i-1;
nr++;
start[nr]=i;
}
b[nr][0]=1;
}
if(!stop[nr])
stop[nr]=n;
while(m--) {
int o;
si>>o;
if(o==1){
int p, s;
si>>p>>s;
update(first[p], last[p], s);
}
else {
int s;
si>>s;
so<<query(s)<<'\n';
}
}
return 0;
}