Cod sursa(job #1409054)

Utilizator UVS_Miriam_Piro_DianaFrumoasele si Bestialul UVS_Miriam_Piro_Diana Data 30 martie 2015 13:11:14
Problema Heavy Path Decomposition Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.65 kb
#include<fstream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
const int Nmax = 100001;
vector<int> G[Nmax],Tr[Nmax];
vector<int> Ch[Nmax];
int Chfat[Nmax],Lev[Nmax];
int Pof[Nmax],Pos[Nmax];
int v[Nmax],*A[Nmax];
int h[Nmax];
int N,M,K,root;
void dfsH(int x,int l){
    h[x]=1,Lev[x]=l;
    for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
        if(!h[*it]) Tr[x].push_back(*it),dfsH(*it,l+1),h[x]+=h[*it];
    }
}
void dfsC(int x,int k){
    Ch[k].push_back(x);
    Pof[x]=k,Pos[x]=Ch[k].size();
    if(G[x].size()){
        int m=0,c;
        for(vector<int>::iterator it=Tr[x].begin();it!=Tr[x].end();++it){
            if(h[*it]>m) m=h[*it],c=*it;
        }
        for(vector<int>::iterator it=Tr[x].begin();it!=Tr[x].end();++it){
            if(*it==c) dfsC(*it,k);
            else Chfat[++K]=x,dfsC(*it,K);
        }
    }
}
void upd(int A[],int i,int st,int dr,int w,int val){
    if(st>=dr) A[i]=val;
    else{
        int mij=(st+dr)/2;
        if(w<=mij) upd(A,2*i,st,mij,w,val);
        else upd(A,2*i+1,mij+1,dr,w,val);
        A[i]=max(A[2*i],A[2*i+1]);
    }
}
int query(int A[],int i,int st,int dr,int a,int b){
    if(a<=st && dr<=b) return A[i];
    int mij=(st+dr)/2;
    if(b<=mij) return query(A,2*i,st,mij,a,b);
    else if(a>mij) return query(A,2*i+1,mij+1,dr,a,b);
    else{
        int ans1=query(A,2*i,st,mij,a,mij);
        int ans2=query(A,2*i+1,mij+1,dr,mij+1,b);
        return max(ans1,ans2);
    }
}
int hpd(int x,int y){
    int ans=0;
    while(Pof[x]!=Pof[y]){
        if(Lev[Chfat[Pof[x]]] < Lev[Chfat[Pof[y]]]) swap(x,y);
        ans=max(ans, query(A[Pof[x]],1,1,Ch[Pof[x]].size(),1,Pos[x]) );
        x=Chfat[Pof[x]];
    }
    if(Pos[x]>Pos[y]) swap(x,y);
    ans=max(ans, query(A[Pof[x]],1,1,Ch[Pof[x]].size(),Pos[x],Pos[y]) );
    return ans;
}
int main(){
    in>>N>>M;
    int x,y;
    for(int i=1;i<=N;i++) in>>v[i];
    for(int i=1;i<N;i++){
        in>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    root=rand()%N+1; root=1;
    dfsH(root,1),dfsC(root,++K);
    for(int i=1;i<=K;i++){
        A[i]=new int[4*(Ch[i].size()+5)];
        for(int j=0;j<4*(Ch[i].size()+5);j++) A[i][j]=0;
    }
    for(int i=1;i<=N;i++) upd(A[Pof[i]],1,1,Ch[Pof[i]].size(),Pos[i],v[i]);
    for(int i=1;i<=M;i++){
        in>>x;
        if(x==0){
            in>>x>>y;
            v[x]=y;
            upd(A[Pof[x]],1,1,Ch[Pof[x]].size(),Pos[x],v[x]);
        }
        else{
            in>>x>>y;
            out<<hpd(x,y)<<'\n';
        }
    }
    return 0;
}