Cod sursa(job #3194183)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 17 ianuarie 2024 11:19:32
Problema Heavy Path Decomposition Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.67 kb
#include <bits/stdc++.h>
#include <cstring>
#include <cstdio>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
#define f first
#define s second
#define mod 1000000007ll
#define nmax 200002
#define lim 351
using namespace std;
typedef long long ll;
ifstream in("heavypath.in");
ofstream out("heavypath.out");
//FILE *fin=fopen("infasuratoare.in","r");
//FILE *fout=fopen("infasuratoare.out","w");
int n,m,i,j,k,l,v[nmax],e[nmax*2],le[nmax],s[nmax],c[nmax],u[nmax],f[nmax],q,x,y,z,o,vr,vl,d;vector<int>g[nmax],ai[nmax],r[nmax];
void df(int i){
    c[i]=i;
    for(auto j:g[i])
        if(j!=f[i]){
            f[j]=i,le[j]=le[i]+1;df(j);
            if(s[c[j]]>s[c[i]])c[i]=c[j];
    }
    ++s[c[i]],r[c[i]].emplace_back(i);
}
void qu(int x,int y,int z){
    //cout<<x<<' '<<y<<' '<<vr<<' '<<vr<<'\n';
    if(z<vr&&z+y>vl){
        if(z>=vl&&z+y<=vr)
            bmaxify(o,ai[d][x])/*,cout<<"f"<<x<<' '<<d<<' '<<' '<<ai[d].size()<<' '<<ai[d][x]<<'\n'*/;
            else qu(x*2,y/2,z),qu(x*2+1,y/2,z+y/2);
    }
}
int main()
{
in>>n>>m;
forq(i,1,n+1)in>>v[i];
for(k=1;k<n;k++)
    in>>i>>j,g[i].emplace_back(j),g[j].emplace_back(i);
le[1]=1;
df(1);
//for(i=1;i<=n;i++)cout<<i<<' '<<c[i]<<' '<<s[c[i]]<<'\n';
for(i=1;i<=n;i++)
    if(s[i]){
        u[i]=s[i]*2-1;
        while(u[i]&(u[i]-1))u[i]&=u[i]-1;
        ai[i].resize(2*u[i],0);
        for(j=0;j<s[i];j++)
            ai[i][u[i]+j]=v[r[i][j]];
        //cout<<i<<' '<<s[i]<<' '<<le[c[x]]-le[x]+u[c[x]]<<'\n';
        //for(k=0;k<u[i]*2;k++)cout<<ai[i][k]<<' ';cout<<'\n';
        for(j=u[i]-1;j;j--)
            ai[i][j]=bmax(ai[i][j*2],ai[i][j*2+1]);
}
while(m--){
    in>>q>>x>>y;
    o=0;
    if(q==0){
        i=le[c[x]]-le[x]+u[c[x]];
        ai[c[x]][i]=v[x]=y;
        while(i>1)
            i/=2,ai[c[x]][i]=bmax(ai[c[x]][i*2],ai[c[x]][i*2+1]);
        //cout<<x<<' '<<c[x]<<' '<<le[c[x]]-le[x]+u[c[x]]<<'\n';
        //for(i=0;i<u[c[x]]*2;i++)cout<<ai[c[x]][i]<<' ';cout<<'\n';
    }
    else{
        while(c[x]!=c[y]){
            if(le[c[x]]-s[c[x]]<le[c[y]]-s[c[y]])sw(x,y);
            //cout<<x<<' '<<y<<'\n';
            vl=le[c[x]]-le[x];
            vr=s[c[x]];
            d=c[x];
            qu(1,u[c[x]],0);
            x=f[*(r[c[x]].rbegin())];
        }
        vl=le[c[x]]-le[x];
        vr=le[c[y]]-le[y];
        d=c[x];
        if(vl>vr)sw(vl,vr);
        ++vr;
        qu(1,u[c[x]],0);
        out<<o<<'\n';
    }
}
}