Cod sursa(job #2768970)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 august 2021 20:30:27
Problema Heavy Path Decomposition Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include<stdio.h>
#include<stdlib.h>
#define M 100001
#define A(x,y) ((x)<(y)?y:x)
int n,m,t,x,y,z,o,i,j,k,v[M],h[M],s[M],d[M],p[M],e[M],b[M],a[2*M],*l[M],*c[M],w[M],q[M],g[M],f[M];
void D(int x,int p)
{
	int u=0,i,j;
	h[x]=h[p]+1,s[x]=1;
	for(i=0;i<w[x];++i)
		if(l[x][i]!=p) {
			D(l[x][i],x),s[x]+=s[l[x][i]];
			if(s[u]<s[l[x][i]])
				u=l[x][i];
		}
	for(i=0;i<w[x];++i)
		if(l[x][i]!=p&&l[x][i]!=u)
			b[d[l[x][i]]]=x;
    d[x]=!u?++o:d[u];
    c[d[x]]=(int*)realloc(c[d[x]],4*q[d[x]]);
	c[d[x]][q[d[x]]++]=x;
}
void U(int p,int v)
{
	for(p+=n,a[p]=v;p>1;p>>=1)
		a[p>>1]=A(a[p],a[p^1]);
}
int Q(int x,int y)
{
	int r=0;
	for(x+=n,y+=n;x<y;x>>=1,y>>=1) {
		if(x&1)
			r=A(r,a[x++]);
		if(y&1)
			r=A(r,a[--y]);
	}
	return r;
}
int H(int x,int y)
{
	int r=0,z;
	while(d[x]!=d[y]) {
		if(h[b[d[x]]]<h[b[d[y]]])
			z=x,x=y,y=z;
		r=A(r,Q(p[x],p[c[d[x]][q[d[x]]]]+1)),x=b[d[x]];
	}
	if(p[x]>p[y])
		z=x,x=y,y=z;
	return A(r,Q(p[x],p[y]+1));
}
int main()
{
	freopen("heavypath.in","r",stdin),freopen("heavypath.out","w",stdout),scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		scanf("%d",v+i);
	for(i=0;i<n-1;++i)
		scanf("%d%d",&g[i],&f[i]),++w[g[i]],++w[f[i]];
    for(i=1;i<=n;w[i++]=0)
        l[i]=(int*)malloc(4*w[i]);
    for(i=0;i<n-1;i++)
        l[g[i]][w[g[i]]++]=f[i],l[f[i]][w[f[i]]++]=g[i];
	for(D(1,0),i=1;i<=o;++i)
		for(j=0;j<q[i];++j)
			p[c[i][j]]=++z,e[z]=c[i][j],a[z+n]=v[c[i][j]];
	for(i=n;i;--i)
		a[i]=A(a[2*i],a[2*i+1]);
	for(i=0;i<m;i++) {
		scanf("%d%d%d",&t,&x,&y);
		if(!t)
			U(p[x],y);
		else if(t==1)
			printf("%d\n",H(x,y));
	}
}