Cod sursa(job #1934723)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 21 martie 2017 19:09:46
Problema Heavy Path Decomposition Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
#define NMAX 100005
#define INF 0x3f3f3f

using namespace std;

int n, m, v[NMAX], viz[NMAX], nrLanturi, tata[NMAX], marimeArboreIntervale[NMAX];
pair <int, int> greutate[NMAX];
stack <int> s;
vector <int> g[NMAX];
vector <int> lant[NMAX];
vector <int> arbIntervale[NMAX];

void read()
{
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; ++i)
        scanf("%d", &v[i]);
    int x, y;
    for(int i=1; i<=n-1; ++i)
    {
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
}

void update(int x, int y)
{

}

int query(int x, int y)
{
    return 0;
}

void createLant(int nod)
{
    vector <int>::iterator it;
    for(it=g[nod].begin(); it!=g[nod].end(); ++it)
        if(viz[*it]==0)
        {
            viz[*it]=1;
            greutate[nod].first+=1;
            tata[*it]=nod;
            createLant(*it);
            greutate[nod].first+=greutate[*it].first;
        }
    int maxim=-1*INF, ok=0, lantMaxim;
    for(it=g[nod].begin(); it!=g[nod].end(); ++it)
        if(*it!=tata[nod] && greutate[*it].first>maxim)
        {
            ok=1;
            maxim=greutate[*it].first;
            lantMaxim=greutate[*it].second;
        }
    if(ok==0)
    {
        lant[++nrLanturi].push_back(nod);
        greutate[nod].second=nrLanturi;
    }
    else
    {
        lant[lantMaxim].push_back(nod);
        greutate[nod].second=lantMaxim;
    }
}

void build(int nr, int poz, int st, int dr)
{
    if(st==dr)
    {
        arbIntervale[nr][poz]=v[lant[nr][st]];
        if(poz>marimeArboreIntervale[nr])
            marimeArboreIntervale[nr]=poz;
        return;
    }
    int mij=(st+dr)/2;
    build(nr, 2*poz, st, mij);
    build(nr, 2*poz+1, mij+1, dr);
    arbIntervale[nr][poz]=max(arbIntervale[nr][2*poz], arbIntervale[nr][2*poz+1]);
}

void createArboriDeIntervale()
{
    for(int i=1; i<=nrLanturi; ++i)
    {
        arbIntervale[i].resize((4*lant[i].size()));
        build(i, 1, 0, lant[i].size()-1);
        for(int j=1; j<=marimeArboreIntervale[i]; ++j)
            printf("%d ", arbIntervale[i][j]);
        printf("\n");
    }
}


int main()
{
    freopen("heavypath.in", "r", stdin);
    //freopen("heavypath.out", "w", stdout);
    read();

    viz[1]=1;
    createLant(1);
    createArboriDeIntervale();

    int operatie, x, y;
    for(int i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &operatie, &x, &y);
        if(operatie==0)
        {
            update(x, y);
        }
        else
        {
            printf("%d\n", query(x, y));
        }
    }
    return 0;
}