Cod sursa(job #1326130)

Utilizator retrogradLucian Bicsi retrograd Data 24 ianuarie 2015 18:55:43
Problema Heavy Path Decomposition Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#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;
}