Pagini recente » Cod sursa (job #2897372) | Cod sursa (job #551014) | Cod sursa (job #2163080) | Cod sursa (job #1862798) | Cod sursa (job #1326130)
#include<fstream>
#include<vector>
#include<ctime>
#include<cstdlib>
#define MAXN 100001
using namespace std;
typedef int var;
ifstream fin("heavypath.in");
ofstream fout("heavypath.out");
vector<var> G[MAXN];
var PARENT[MAXN], RANK[MAXN], V[MAXN];
var n;
bool VIZ[MAXN];
void dfs(var node) {
VIZ[node] = 1;
for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
var vec = *it;
if(!VIZ[vec]) {
PARENT[vec] = node;
RANK[vec] = RANK[node] + 1;
dfs(vec);
}
}
}
var query (var a, var b) {
var MAX = -1;
while(RANK[a] < RANK[b]) {
MAX = max(MAX, V[b]);
b = PARENT[b];
}
while(RANK[b] < RANK[a]) {
MAX = max(MAX, V[a]);
a = PARENT[a];
}
while(b != a) {
MAX = max(MAX, V[a]);
MAX = max(MAX, V[b]);
a = PARENT[a];
b = PARENT[b];
}
return max(MAX, V[a]);
}
int main() {
var m, a, b;
fin>>n>>m;
srand(time(NULL));
for(var i=1; i<=n; i++) {
fin>>V[i];
}
for(var i=1; i<n; i++) {
fin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
bool type;
var root = rand() % n + 1;
dfs(root);
while(m--) {
fin>>type>>a>>b;
if(type == 1) {
fout<<query(a, b)<<'\n';
} else {
V[a] = b;
}
}
return 0;
}