Cod sursa(job #1472707)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 17 august 2015 16:45:16
Problema Heavy Path Decomposition Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.43 kb
#include<stdio.h>
#include<stdlib.h>
int i,a[100001],b[100001],t,x,y,n,m,h,s,v[100001],f[100001],u[100001],l[100001],c[400004],r[100001],lv[100001],d[100001],z[100001];
int w[100001],*g[100001],*p[100001],oi[100001],oix,ru,j;
void D(int o) {
	f[o]=w[o]=1;
	int e=1,b=-1,i;
	for(i=0;i<oi[o];i++)
    if(!f[g[o][i]])
        e=0,u[g[o][i]]=u[o]+1,D(g[o][i]),w[o]+=w[g[o][i]],b=(b==-1||w[g[o][i]]>w[b])?g[o][i]:b;
	if(e) {
		l[o]=++h,d[h]=1,p[h]=(int*)realloc(p[h],p[h][0]+2),p[h][++p[h][0]]=o;
    	return;
	}
	l[o]=l[b],d[l[o]]++,p[l[o]]=(int*)realloc(p[l[o]],p[l[o]][0]+2),p[l[o]][++p[l[o]][0]]=o;
	for(i=0;i<oi[o];i++)
    if(g[o][i]!=b&&u[g[o][i]]>=u[o])
        r[l[g[o][i]]]=o,lv[l[g[o][i]]]=u[o];
}
void B(int o,int l,int r,int d,int z) {
	if(l==r)
		c[o+d]=v[p[z][l-1]];
	else
		B(o*2,l,(l+r)/2,d,z),B(o*2+1,(l+r)/2+1,r,d,z),c[o+d]=c[o*2+d]<c[o*2+1+d]?c[o*2+1+d]:c[o*2+d];
}
void U(int o,int l,int r,int z,int v,int d) {
	if(l==r) {
		c[o+d]=v;
    	return;
	}
	if(z<=(l+r)/2)
    	U(o*2,l,(l+r)/2,z,v,d);
	else
    	U(o*2+1,(l+r)/2+1,r,z,v,d);
	c[o+d]=c[o*2+d]<c[o*2+1+d]?c[o*2+1+d]:c[o*2+d];
}
int Q(int o,int l,int r,int e,int f,int d) {
	if(e<=l&&r<=f)
    	return c[o+d];
	int m=(l+r)/2,z=0,y;
	if(e<=m)
    	z=z<(y=Q(o*2,l,m,e,f,d))?y:z;
	if(m<f)
    	z=z<(y=Q(o*2+1,m+1,r,e,f,d))?y:z;
	return z;
}
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=1;i<n;++i)
    	scanf("%d%d",&a[i],&b[i]),oi[a[i]]++,oi[b[i]]++;
    for(i=1;i<=n;oi[i++]=0)
        g[i]=p[i]=(int*)malloc(oi[i]*sizeof(int));
    for(i=1;i<n;i++)
        g[a[i]][oi[a[i]]++]=b[i],g[b[i]][oi[b[i]]++]=a[i];
	for(u[1]=i=1,D(1);i<=h;i++) {
		for(j=1;j<=p[i][0]/2;j++)
            oix=p[i][j],p[i][j]=p[i][p[i][0]-j+1],p[i][p[i][0]-j+1]=oix;
		z[i]=i>1?(z[i-1]+d[i-1]*4):z[i],B(1,1,d[i],z[i],i);
	}
	while(m--) {
		scanf("%d%d%d",&t,&x,&y);
    	if(!t)
          	U(1,1,d[l[x]],u[x]-lv[l[x]],y,z[l[x]]);
    	else {
			while(1) {
				if(l[x]==l[y]) {
					if(u[x]>u[y])
                        oix=x,x=y,y=oix;
                    s=s<(ru=Q(1,1,d[l[x]],u[x]-lv[l[x]],u[y]-lv[l[x]],z[l[x]]))?ru:s;
                    break;
				}
                if(lv[l[x]]<lv[l[y]])
                    oix=x,x=y,y=oix;
                s=s<(ru=Q(1,1,d[l[x]],1,u[x]-lv[l[x]],z[l[x]]))?ru:s,x=r[l[x]];
			}
          	printf("%d\n",s),s=0;
		}
	}
}