Pagini recente » Cod sursa (job #365365) | Borderou de evaluare (job #278300) | Cod sursa (job #383116) | Cod sursa (job #857723) | Cod sursa (job #1959452)
#include <iostream>
#include <fstream>
#include <vector>
#define NMax 100001
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
vector <int> v[NMax];
int nivel[NMax], tata[NMax], val[NMax];
int n, m, x, y, op, lvl;
int LCA(int nodA, int nodB) {
int MAX = 0;
while(nodA != nodB) {
MAX = max(max(val[nodA], val[nodB]), MAX);
if (nivel[nodA] < nivel[nodB]) {
nodB = tata[nodB];
} else if(nivel[nodA] > nivel[nodB]) {
nodA = tata[nodA];
} else {
nodA = tata[nodA];
nodB = tata[nodB];
}
}
MAX = max (MAX, val[nodA]);
return MAX;
}
void DFS(int nod, int Tnod) {
int fiu;
lvl++;
nivel[nod] = lvl;
tata[nod] = Tnod;
for(int i = 0 ; i < v[nod].size(); i++) {
fiu = v[nod][i];
if(fiu == Tnod)
continue;
DFS(fiu, nod);
}
lvl--;
}
int main()
{
fin>>n>>m;
for(int i = 1; i <= n; i++) {
fin>>val[i];
}
for(int i = 1; i < n; i++) {
fin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
DFS(1, 0);
for(int i = 1; i <= m; i++) {
fin>>op>>x>>y;
if(op == 1) {
fout<<LCA(x, y)<<'\n';
//query(x, y);
} else {
val[x] = y;
//update(x, y);
}
}
/*
for(int i = 1; i <= n; i++) {
cout<<tata[i]<<' ';
}
cout<<'\n';
for(int i = 1; i <= n; i++) {
cout<<nivel[i]<<' ';
}
cout<<'\n';
*/
fin.close();
fout.close();
return 0;
}
/*
#include <iostream>
#include <fstream>
#include <vector>
#define NMax 100001
using namespace std;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
vector <int> v[NMax];
int w[NMax], label[NMax], pos[NMax], val[NMax], roof[NMax];
int n, m, x, y, op, labelNr = 1, posNr;
void DFS(int nod, int Tnod) {
int fiu;
w[nod] = 1;
posNr++;
label[nod] = labelNr;
pos[nod] = posNr;
for(int i = 0 ; i < v[nod].size(); i++) {
fiu = v[nod][i];
if(fiu == Tnod)
continue;
DFS(fiu, nod);
w[nod] += w[fiu];
if(i < v[nod].size() - 1)
labelNr++;
posNr = 0;
}
}
int main()
{
fin>>n>>m;
for(int i = 1; i <= n; i++) {
fin>>val[i];
}
for(int i = 1; i < n; i++) {
fin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
DFS(1, 0);
labelNr--;
for(int i = 1; i <= m; i++) {
fin>>op>>x>>y;
if(op == 1) {
//query(x, y);
} else {
//update(x, y);
}
}
for(int i = 1; i <= n; i++) {
cout<<w[i]<<' ';
}
cout<<'\n';
for(int i = 1; i <= n; i++) {
cout<<label[i]<<' ';
}
cout<<'\n';
for(int i = 1; i <= n; i++) {
cout<<pos[i]<<' ';
}
fin.close();
fout.close();
return 0;
}
*/