import core.stdc.stdio;
import std.algorithm;

static immutable int unSet=-114514;

struct Data{
	int a,l,r,m;
}
Data Comb(const ref Data a,const ref Data b){
	Data r;
	r.a=a.a+b.a;
	r.l=max(a.l,a.a+b.l);
	r.r=max(a.r+b.a,b.r);
	r.m=max(a.m,b.m,a.r+b.l);
	return r;
}

struct Node{
	Node* l,r,p;
	int delay=unSet,size,v;
	Data d;
	bool rev;
	int State(){
		if(p !is null){
			if(p.l==&this) return -1;
			if(p.r==&this) return 1;
		}
		return 0;
	}
	void Propagate(){
		if(rev){
			if(l !is null) l.rev=!l.rev;
			if(r !is null) r.rev=!r.rev;
			swap(l,r);
			swap(d.l,d.r);
			rev=false;
		}
		if(delay!=unSet){
			if(l !is null) l.delay=delay;
			if(r !is null) r.delay=delay;
			int s=delay*(delay<0?1:size);
			d=Data(delay*size,s,s,s);
			v=delay;
			delay=unSet;
		}
	}
	void Prepare(){
		if(State)
			p.Prepare;
		Propagate;
	}
	void Update(){
		Propagate;
		d=Data(v,v,v,v);
		size=1;
		if(l !is null){
			l.Propagate;
			d=Comb(l.d,d);
			size+=l.size;
		}
		if(r !is null){
			r.Propagate;
			d=Comb(d,r.d);
			size+=r.size;
		}
	}
	void Rotate(){
		Node* par=p,ch;
		if(p.l==&this){
			ch=r;
			r=p;
			r.l=ch;
		}else{
			ch=l;
			l=p;
			l.r=ch;
		}
		if(ch) ch.p=p;
		p=par.p;
		par.p=&this;
		if(p !is null){
			if(p.l==par) p.l=&this;
			if(p.r==par) p.r=&this;
		}
		par.Update;
		Update;
	}
	void Splay(){
		Prepare;
		while(State){
			int s=State*p.State;
			if(!s)
				Rotate;
			else if(s==1){
				p.Rotate;
				Rotate;
			}else{
				Rotate;
				Rotate;
			}
		}
	}
	void Expose(){
		Node* x=&this;
		while(x){
			x.Splay;
			x=x.p;
		}
		x=&this;
		while(x.p){
			x.p.r=x;
			x=x.p;
			x.Update;
		}
		Splay;
	}
	void Evert(){
		Expose;
		r=null;
		rev=!rev;
		Update;
	}
	void Link(Node* t){
		Evert;
		t.Expose;
		p=t;
		t.r=&this;
		t.Update;
	}
	void Set(int x){
		Expose;
		r=null;
		delay=x;
		Update;
	}
	int Get(){
		Expose;
		r=null;
		Update;
		return d.m;
	}
}

void main(){
	int n,q;
	scanf("%d%d",&n,&q);
	Node[] ns=new Node[n];
	foreach(ref nd;ns){
		int w;
		scanf("%d",&w);
		nd.v=w;
		nd.d=Data(w,w,w,w);
	}
	foreach(i;0..n-1){
		int s,e;
		scanf("%d%d",&s,&e);
		ns[--s].Link(&ns[--e]);
	}
	foreach(_;0..q){
		int t,a,b,c;
		scanf("%d%d%d%d",&t,&a,&b,&c);
		if(t==1){
			ns[--a].Evert;
			ns[--b].Set(c);
		}else{
			ns[--a].Evert;
			printf("%d\n",ns[--b].Get);
		}
	}
}