#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
struct TREAP
{
	struct node
	{
		int l,r;
		int cnt;
		int key;
		long long sum;
		int w;
		int p;
		int fa;
		int sgncnt;
		bool sgnp,sgn;
	}a[80010];
	int root;
	int MOD;
	void clear()
	{
		root=0;MOD=998244353;
		for(int i=0;i<80010;i++)
		{
			a[i].l=a[i].r=a[i].p=a[i].sum=a[i].sgnp=a[i].sgn=a[i].sgncnt=a[i].cnt=0;
			a[i].key=1ll*rand()*rand()%MOD;
		}
	}
	void modifynum(int x,int d)
	{
		if(x)
		{
			a[x].w+=d*(a[x].sgn?-1:1);
			a[x].sum+=1ll*(a[x].cnt-2*a[x].sgncnt)*d;
			a[x].p+=d;
		}
	}
	void modifysgn(int x)
	{
		if(x)
		{
			a[x].sgnp^=1;
			a[x].sgn^=1;
			a[x].w=-a[x].w;
			a[x].sum=-a[x].sum;
			a[x].sgncnt=a[x].cnt-a[x].sgncnt;
		}
	}
	void update(int x)
	{
		int l=a[x].l,r=a[x].r;
		a[x].cnt=a[l].cnt+a[r].cnt+1;
		a[x].sum=a[l].sum+a[r].sum+a[x].w;
		a[x].sgncnt=a[l].sgncnt+a[r].sgncnt+a[x].sgn;
		if(l)
		{
			a[l].fa=x;
		}
		if(r)
		{
			a[r].fa=x;
		}
	}
	void pushdown(int x)
	{
		int l=a[x].l,r=a[x].r;
		if(a[x].sgnp)
		{
			modifysgn(l);
			modifysgn(r);
			a[x].sgnp=0;
		}
		if(a[x].p)
		{
			modifynum(l,a[x].p);
			modifynum(r,a[x].p);
			a[x].p=0;
		}
	}
	int merge(int x,int y)
	{
		if(x==0||y==0)
		{
			return x+y;
		}
		pushdown(x);
		pushdown(y);
		if(a[x].key>a[y].key)
		{
			a[x].r=merge(a[x].r,y);
			update(x);
			return x;
		}
		else
		{
			a[y].l=merge(x,a[y].l);
			update(y);
			return y;
		}
	}
	void split(int t,int k,int &x,int &y)
	{
		if(t==0)
		{
			x=y=0;
			return;
		}
		pushdown(t);
		if(a[a[t].l].cnt+1<=k)
		{
			x=t;
			split(a[t].r,k-a[a[t].l].cnt-1,a[t].r,y);
		}
		else
		{
			y=t;
			split(a[t].l,k,x,a[t].l);
		}
		if(x!=0)
		{
			update(x);
		}
		if(y!=0)
		{
			update(y);
		}
	}
	int getpos(int x)
	{
		int tmp=a[a[x].l].cnt+1;
		for(;x!=root;x=a[x].fa)
		{
			if(a[a[x].fa].r==x)
			{
				tmp+=a[a[x].fa].cnt-a[x].cnt;
			}
		}
		return tmp;
	}
	bool getsgn(int x)
	{
		int t1,t2,t3;
		split(root,getpos(x)-1,t1,t2);
		split(t2,1,t2,t3);
		bool t=a[t2].sgn;
		root=merge(merge(t1,t2),t3);
		return t;
	}
}Treap,BTreap;
struct Binary_Tree
{
	struct node
	{
		int l,r,fa;
	}a[40010];
	void clear()
	{
		BTreap.clear();
		for(int i=0;i<40010;i++)
		{
			a[i].l=a[i].r=a[i].fa=0;
		}
	}
	bool havelson(int v){return a[v].l;};
	bool haverson(int v){return a[v].r;};
	bool vinu(int u,int v)
	{
		int pos1=BTreap.getpos(2*u-1),pos2=BTreap.getpos(2*u),pos3=BTreap.getpos(2*v-1);
		return pos1<=pos3&&pos3<=pos2;
	}
	int getcnt(int v)
	{
		int pos1=BTreap.getpos(2*v-1),pos2=BTreap.getpos(2*v);
		return (pos2-pos1+1)/2;
	}
	void linkutovl(int u,int v)
	{
		int fa=a[u].fa;
		if(a[fa].l==u)
		{
			a[fa].l=0;
		}
		else
		{
			a[fa].r=0;
		}
		a[v].l=u;
		a[u].fa=v;
		int pos1=BTreap.getpos(2*u-1),pos2=BTreap.getpos(2*u);
		int t1,t2,t3;
		BTreap.split(BTreap.root,pos1-1,t1,t2);
		BTreap.split(t2,pos2-pos1+1,t2,t3);
		BTreap.root=BTreap.merge(t1,t3);
		pos1=BTreap.getpos(2*v-1);
		BTreap.split(BTreap.root,pos1,t1,t3);
		BTreap.root=BTreap.merge(BTreap.merge(t1,t2),t3);
	}
	void linkutovr(int u,int v)
	{
		int fa=a[u].fa;
		if(a[fa].l==u)
		{
			a[fa].l=0;
		}
		else
		{
			a[fa].r=0;
		}
		a[v].r=u;
		a[u].fa=v;
		int pos1=BTreap.getpos(2*u-1),pos2=BTreap.getpos(2*u);
		int t1,t2,t3;
		BTreap.split(BTreap.root,pos1-1,t1,t2);
		BTreap.split(t2,pos2-pos1+1,t2,t3);
		BTreap.root=BTreap.merge(t1,t3);
		pos1=BTreap.getpos(2*v);
		BTreap.split(BTreap.root,pos1-1,t1,t3);
		BTreap.root=BTreap.merge(BTreap.merge(t1,t2),t3);
	}
	void swapson(int v)
	{
		int l=a[v].l,r=a[v].r;
		int cnt1=getcnt(l),cnt2=getcnt(r),pos=BTreap.getpos(2*v-1);
		int t1,t2,t3,t4;
		BTreap.split(BTreap.root,pos,t1,t2);
		BTreap.split(t2,cnt1*2,t2,t3);
		BTreap.split(t3,cnt2*2,t3,t4);
		BTreap.root=BTreap.merge(BTreap.merge(t1,t3),BTreap.merge(t2,t4));
		swap(a[v].l,a[v].r);
	}
	void make_Treap(int p)
	{
		BTreap.a[2*p-1].cnt=BTreap.a[2*p].cnt=1;
		BTreap.root=BTreap.merge(BTreap.root,2*p-1);
		if(a[p].l)
		{
			make_Treap(a[p].l);
		}
		if(a[p].r)
		{
			make_Treap(a[p].r);
		}
		BTreap.root=BTreap.merge(BTreap.root,2*p);
	}
}BT;
int dfs(int p,bool sgn)
{
	Treap.a[p].sgn=sgn;
	Treap.a[p].cnt=1;
	if(sgn)
	{
		Treap.a[p].w=-Treap.a[p].w;
		Treap.a[p].sum=-Treap.a[p].sum;
		Treap.a[p].sgncnt=1;
	}
	int t1=0,t2=0;
	if(BT.a[p].l)
	{
		t1=dfs(BT.a[p].l,sgn);
	}
	if(BT.a[p].r)
	{
		t2=dfs(BT.a[p].r,sgn^1);
	}
	return Treap.merge(p,Treap.merge(t1,t2));
}
int n,u,v,d,m,opt;
int main()
{
	srand(time(0));
	for(;scanf("%d",&n)>0;)
	{
		Treap.clear();
		BT.clear();
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&Treap.a[i].w);
			Treap.a[i].sum=Treap.a[i].w;
		}
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&BT.a[i].l,&BT.a[i].r);
			if(BT.a[i].l)
			{
				BT.a[BT.a[i].l].fa=i;
			}
			if(BT.a[i].r)
			{
				BT.a[BT.a[i].r].fa=i;
			}
		}
		Treap.root=dfs(1,0);
		BT.make_Treap(1);
		scanf("%d",&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&opt);
			if(opt==1)
			{
				scanf("%d%d",&u,&v);
				if(BT.havelson(v)||BT.vinu(u,v))
				{
					puts("F");
				}
				else
				{
					puts("S");
					bool sgn1=Treap.getsgn(BT.a[u].fa)^(BT.a[BT.a[u].fa].r==u),sgn2=Treap.getsgn(v);
					int tmp=Treap.getpos(u),cnt=BT.getcnt(u);
					int t1,t2,t3;
					BT.linkutovl(u,v);
					Treap.split(Treap.root,tmp-1,t1,t2);
					Treap.split(t2,cnt,t2,t3);
					Treap.root=Treap.merge(t1,t3);
					if(sgn1!=sgn2)
					{
						Treap.modifysgn(t2);
					}
					tmp=Treap.getpos(v);
					Treap.split(Treap.root,tmp,t1,t3);
					Treap.root=Treap.merge(Treap.merge(t1,t2),t3);
				}
			}
			else if(opt==2)
			{
				scanf("%d%d",&u,&v);
				if(BT.haverson(v)||BT.vinu(u,v))
				{
					puts("F");
				}
				else
				{
					puts("S");
					bool sgn1=Treap.getsgn(BT.a[u].fa)^(BT.a[BT.a[u].fa].l==u),sgn2=Treap.getsgn(v);
					int tmp=Treap.getpos(u),cnt=BT.getcnt(u),cntv=BT.getcnt(v);
					if(BT.vinu(v,u))
					{
						cntv-=cnt;
					}
					int t1,t2,t3;
					BT.linkutovr(u,v);
					Treap.split(Treap.root,tmp-1,t1,t2);
					Treap.split(t2,cnt,t2,t3);
					Treap.root=Treap.merge(t1,t3);
					if(sgn1!=sgn2)
					{
						Treap.modifysgn(t2);
					}
					tmp=Treap.getpos(v);
					Treap.split(Treap.root,tmp+cntv-1,t1,t3);
					Treap.root=Treap.merge(Treap.merge(t1,t2),t3);
				}
			}
			else if(opt==3)
			{
				scanf("%d",&v);
				if(!BT.havelson(v)||!BT.haverson(v))
				{
					puts("F");
				}
				else
				{
					puts("S");
					int tmp=Treap.getpos(v);
					int t1,t2,t3,t4;
					Treap.split(Treap.root,tmp,t1,t2);
					Treap.split(t2,BT.getcnt(BT.a[v].l),t2,t3);
					Treap.split(t3,BT.getcnt(BT.a[v].r),t3,t4);
					Treap.modifysgn(t2);
					Treap.modifysgn(t3);
					Treap.root=Treap.merge(Treap.merge(t1,t3),Treap.merge(t2,t4));
					BT.swapson(v);
				}
			}
			else if(opt==4)
			{
				puts("S");
				scanf("%d%d",&v,&d);
				int tmp=Treap.getpos(v);
				int t1,t2,t3;
				Treap.split(Treap.root,tmp-1,t1,t2);
				Treap.split(t2,1,t2,t3);
				Treap.a[t2].w=Treap.a[t2].sum=d*(Treap.a[t2].sgn?-1:1);
				Treap.root=Treap.merge(Treap.merge(t1,t2),t3);
			}
			else if(opt==5)
			{
				puts("S");
				scanf("%d%d",&v,&d);
				int tmp=Treap.getpos(v);
				int t1,t2,t3;
				Treap.split(Treap.root,tmp-1,t1,t2);
				Treap.split(t2,BT.getcnt(v),t2,t3);
				Treap.modifynum(t2,d);
				Treap.root=Treap.merge(Treap.merge(t1,t2),t3);
			}
			else
			{
				scanf("%d",&v);
				int tmp=Treap.getpos(v);
				bool sgn=Treap.getsgn(v);
				int t1,t2,t3;
				Treap.split(Treap.root,tmp-1,t1,t2);
				Treap.split(t2,BT.getcnt(v),t2,t3);
				printf("%lld\n",Treap.a[t2].sum*(sgn?-1:1));
				Treap.root=Treap.merge(Treap.merge(t1,t2),t3);
			}
		}
	}
	return 0;
}