Cod sursa(job #2776262)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 septembrie 2021 09:57:36
Problema Heavy Path Decomposition Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.58 kb
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream F("heavypath.in");
ofstream G("heavypath.out");
#define N 100010
int n,m,Y,v[N],f[N],V[N],w[N],l[N],c[4*N],t,x,y,a,b,i,T[N],Z[N],I[N],P[N],s;
vector<int> g[N],p[N];
pair<int,pair<int,int> > o[N];
void D(int q)
{
    f[q]=w[q]=1;
    int H=-1,F=1;
    vector<int>::iterator i;
    for(i=g[q].begin();i!=g[q].end();++i) {
        if(f[*i])
            continue;
        F=0,V[*i]=V[q]+1,D(*i),w[q]+=w[*i];
        if(H==-1)
            H=*i;
        else if(w[H]<w[*i])
            H=*i;
    }
    if(F) {
        l[q]=++Y,I[Y]=1,p[Y].push_back(q);
        return;
    }
    l[q]=l[H],++I[l[q]],p[l[q]].push_back(q);
    for(i=g[q].begin();i!=g[q].end();++i) {
        if((*i)==H||V[*i]<V[q])
            continue;
        T[l[*i]]=q,Z[l[*i]]=V[q];
    }
}
void B(int q,int L,int R,int d,int l)
{
    if(L==R) {
        c[q+d]=v[p[l][L-1]];
        return;
    }
    int e=(L+R)/2;
    B(q*2,L,e,d,l);
    B(q*2+1,e+1,R,d,l);
    c[q+d]=max(c[q*2+d],c[q*2+1+d]);
}
void U(int q,int L,int R,int p,int v,int d)
{
    if(L==R) {
        c[q+d]=v;
        return;
    }
    int e=(L+R)/2;
    if(p<=e)
        U(q*2,L,e,p,v,d);
    else
        U(q*2+1,e+1,R,p,v,d);
    c[q+d]=max(c[q*2+d],c[q*2+1+d]);
}
int Q(int q,int L,int R,int E,int F,int d)
{
    if(E<=L&&R<=F)
        return c[q+d];
    int e=(L+R)/2,r=0;
    if(E<=e)
        r=max(r,Q(q*2,L,e,E,F,d));
    if(e<F)
        r=max(r,Q(q*2+1,e+1,R,E,F,d));
    return r;
}
int main()
{
    F>>n>>m;
    for(i=1;i<=n;++i)
        F>>v[i];
    for(i=1;i<n;++i)
        F>>a>>b,g[a].push_back(b),g[b].push_back(a);
    for(i=1;i<=m;++i)
        F>>t>>x>>y,o[i]=make_pair(t,make_pair(x,y));
    V[1]=1,D(1);
    for(i=1;i<=Y;++i) {
        reverse(p[i].begin(),p[i].end());
        if(i>1)
            P[i]=P[i-1]+I[i-1]*4;
        B(1,1,I[i],P[i],i);
    }
    for(i=1;i<=m;++i) {
        t=o[i].first,x=o[i].second.first,y=o[i].second.second;
        if(!t)
            U(1,1,I[l[x]],V[x]-Z[l[x]],y,P[l[x]]);
        else {
            s=0;
            while(1) {
                if(l[x]==l[y]) {
                    if(V[x]>V[y])
                        swap(x,y);
                    s=max(s,Q(1,1,I[l[x]],V[x]-Z[l[x]],V[y]-Z[l[x]],P[l[x]]));
                    break;
                }
                if(Z[l[x]]<Z[l[y]])
                    swap(x,y);
                s=max(s,Q(1,1,I[l[x]],1,V[x]-Z[l[x]],P[l[x]])),x=T[l[x]];
            }
            G<<s<<"\n";
        }
    }
    return 0;
}