Cod sursa(job #1959452)

Utilizator Train1Train1 Train1 Data 9 aprilie 2017 15:25:57
Problema Heavy Path Decomposition Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 3.01 kb
#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;
}
*/