Pagini recente » Cod sursa (job #2455914) | Cod sursa (job #1430263) | Cod sursa (job #1738334) | Cod sursa (job #1260215) | Cod sursa (job #879868)
Cod sursa(job #879868)
#include <fstream>
#include <vector>
#define nmax 100100
using namespace std;
struct ai{int S,Max;}AI[4*nmax];
vector <int> G[nmax],V;
int N,M,Answer,A[nmax],B[nmax];
bool viz[nmax];
bool Query(int Nod,int Left,int Right,int Val) {
if(Right<Left)
return 0;
if(Val == AI[Nod].S) {
Answer=V[Left-1];
return 1;
}
int Mid=(Left+Right)>>1;
if(Left!=Right && Val-AI[Nod].S>0 && AI[Nod].Max>=Val)
if(Query(2*Nod,Left,Mid,Val-AI[Nod].S)==1 ||
Query(2*Nod+1,Mid+1,Right,Val-AI[Nod].S)==1)
return 1;
return 0;
}
void Update(int Nod,int Left,int Right,int Angajat,int Val) {
if(Right<Left)
return;
if(A[Angajat]<=Left && Right<= B[Angajat])
AI[Nod].S+=Val;
else {
int Mid=(Left+Right)>>1;
if(A[Angajat]<=Mid) Update(2*Nod,Left,Mid,Angajat,Val);
if(Mid<B[Angajat]) Update(2*Nod+1,Mid+1,Right,Angajat,Val);
}
AI[Nod].Max=AI[Nod].S+max(AI[2*Nod].Max,AI[2*Nod+1].Max);
}
void DFS(int Nod) {
viz[Nod]=1;
V.push_back(Nod);
A[Nod]=V.size();
for(int i=0;i<G[Nod].size();i++)
if(!viz[G[Nod][i]])
DFS(G[Nod][i]);
B[Nod]=V.size();
}
void read(ifstream & in) {
int i,x,y;
in>>N>>M;
for(i=1;i<N;i++) {
in>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
}
int main() {
int tip,Angajat,Val;
ifstream in("arbore.in");
ofstream out("arbore.out");
read(in);
DFS(1);
while(M--) {
in>>tip;
if(tip==1) {
in>>Angajat>>Val;
Update(1,1,N,Angajat,Val);
}
else {
in>>Val;
if(Query(1,1,N,Val))
out<<Answer<<'\n';
else
out<<"-1\n";
}
}
in.close();
out.close();
return 0;
}