Pagini recente » Cod sursa (job #2044767) | Cod sursa (job #1304475) | Cod sursa (job #1772836) | Cod sursa (job #48686) | Cod sursa (job #2822598)
#include <bits/stdc++.h>
using namespace std;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
const int nmax = 100005;
int n,m,v[nmax],parent[nmax],depth[nmax],Size[nmax],heavy[nmax],pos,paths[nmax];
int head[nmax],posInPaths[nmax];
vector<vector<int>> g;
void dfs(int node) {
int maxSize = 0;
for (auto k : g[node]) {
if (k == parent[node]) continue;
parent[k] = node;
depth[k] = depth[node] + 1;
dfs(k);
Size[node] += Size[k];
if (Size[k] > maxSize) {
maxSize = Size[k];
heavy[node] = k;
}
}
Size[node]++;
}
void decomp(int node, int curHead) {
paths[++pos] = node;
posInPaths[node] = pos;
head[node] = curHead;
if (heavy[node] != 0) {
decomp(heavy[node] , curHead);
}
for (auto k : g[node]) {
if (k == parent[node]) continue;
if (k != heavy[node]) {
decomp(k , k);
}
}
}
struct SegTree {
int l,r,val;
SegTree *lChild, *rChild;
SegTree(int l, int r) : l(l) , r(r) {
if (l == r) {
val = v[paths[l]];
} else {
int mij = (l + r) / 2;
lChild = new SegTree(l, mij);
rChild = new SegTree(mij + 1, r);
val = max(lChild -> val , rChild -> val);
}
}
void update(int qpos, int newVal) {
if (qpos == l && qpos == r) {
val = newVal;
return;
}
if (qpos < l || qpos > r) return;
lChild -> update(qpos, newVal);
rChild -> update(qpos, newVal);
val = max(lChild -> val , rChild -> val);
}
int query(int ql, int qr) {
if (ql <= l && r <= qr) {
return val;
}
if (l > qr || r < ql) {
return 0;
}
return max( lChild -> query(ql, qr) , rChild -> query(ql, qr) );
}
SegTree() {}
};
SegTree segTree;
int pathQuerry(int a, int b) {
int res = 0;
for (; head[a] != head[b]; b = parent[head[b]]) {
if (depth[head[a]] > depth[head[b]])
swap(a, b);
int cur_heavy_path_max = segTree.query(posInPaths[head[b]], posInPaths[b]);
res = max(res, cur_heavy_path_max);
}
if (depth[a] > depth[b])
swap(a, b);
int last_heavy_path_max = segTree.query(posInPaths[a], posInPaths[b]);
res = max(res, last_heavy_path_max);
return res;
}
int main() {
in >> n >> m;
g.resize(n + 1);
for (int i = 1; i <= n; i++) {
in >> v[i];
}
for (int i = 1; i < n; i++) {
int u,v;
in >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
depth[1] = 1;
dfs(1);
decomp(1, 1);
segTree = SegTree(1 , n);
//int x = pathQuerry(1 , 7);
for (int i = 1; i <= m; i++) {
int t,x,y;
in >> t >> x >> y;
if (t == 1) {
out << pathQuerry(x , y) << "\n";
}
else {
segTree.update(posInPaths[x] , y);
}
}
return 0;
}