Cod sursa(job #2935964)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 7 noiembrie 2022 19:09:09
Problema Heavy Path Decomposition Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 5;
int t[2 * N], nxt[N], tin[N], timer, val[N], sz[N], n, par[N], d[N];
void update(int pos, int val) {
    for(t[pos += n] = val; pos > 1; pos >>= 1)
        t[pos >> 1] = max(t[pos], t[pos ^ 1]);
}
int q(int l, int r)
{
    int res = 0;
    for(l += n, r += n; l < r; l >>= 1, r >>= 1) {
        if(l & 1) res = max(res, t[l++]);
        if(r & 1) res = max(res, t[--r]);
    }
    return res;
}
vector <int> g[N];
void dfs1(int u, int p)
{
    sz[u] = 1; d[u] = d[p] + 1; par[u] = p;
    for(int& v : g[u]) if(v != p) {
        dfs1(v, u);
        sz[u] += sz[v];
        if(g[u][0] == p || sz[v] < sz[g[u][0]]) swap(v, g[u][0]);
    }
}
void dfs2(int u, int p)
{
    tin[u] = timer++;
    for(int v : g[u]) if(v != p) {
        nxt[v] = (v == g[u][0] ? nxt[u] : v);
        dfs2(v, u);
    }
}
int query(int x, int y) {
    int res = 0;
    while(nxt[x] != nxt[y]) {
        if(d[nxt[x]] < d[nxt[y]]) swap(x, y);
        res = max(res, q(tin[nxt[x]], tin[x] + 1));
        x = par[nxt[x]];
    }
    if(d[x] > d[y]) swap(x, y);
    return max(res, q(tin[x], tin[y] + 1));
}

int main()
{
    ifstream cin("heavypath.in");
    ofstream cout("heavypath.out");
    int q;
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
        cin >> val[i];
    for(int i = 1, u, v; i < n; i++)
        cin >> u >> v,
        g[u].push_back(v),
        g[v].push_back(u);
    dfs1(1, 0);
    nxt[1] = 1;
    dfs2(1, 0);
    for(int u = 1; u <= n; u++)
        update(tin[u], val[u]);
    for(int i = 1; i <= q; i++) {
        int t, x, y;
        cin >> t >> x >> y;
        if(t) cout << query(x, y) << "\n";
        else update(tin[x], y);
    }
    return 0;
}