#include <iostream>
#include <fstream>
#include <string>
#define DN 50005
#define un unsigned
using namespace std;
int v[DN],t[2*DN+13],maxx[2*DN+13],n,poz,val,arb[4*DN],a,b,rez=0;
string x;
inline int tata(int nod)
{
while(t[nod])
nod=t[nod];
return nod;
}
void upd(int radacina,int nod)
{
int maxim=0;
while(t[nod])
{
int next_nod=t[nod];
maxim=max(maxim,maxx[nod]);
t[nod]=radacina;
nod=next_nod;
}
maxim=max(maxim,maxx[nod]);
maxx[radacina]=max(maxx[radacina],maxim);
t[nod]=radacina;
}
void update(int nod,int left,int right)
{
if(left==right)
{
arb[nod]=val;
return;
}
int mij=(left+right)/2;
if(poz<=mij) update(2*nod,left,mij);
else update(2*nod+1,mij+1,right);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
return;
}
void query(int nod,int left,int right)
{
if(a <= left && right <= b)
{
rez=max(rez,arb[nod]);
return;
}
int mij=(left+right)/2;
if(a<= mij) query(2*nod,left,mij);
if( mij < b) query(2*nod+1,mij+1,right);
return;
}
int main()
{
int s,m;
ifstream f("tabara2.in");
ofstream g("tabara2.out");
f>>n>>s>>m;
getline(f,x);
getline(f,x);
for(un int i=0;i<x.size();++i)
{
if(isdigit(x[i]))
{
int nr=0;
while(isdigit(x[i]))
{
nr=nr*10+x[i]-'0';
++i;
}
v[++v[0]]=nr;
}
}
for(;m;--m)
{
char x;
f>>x;
if(x=='U')
{
int tip,i,j;
f>>tip>>i>>j;
if(tip==1)
{
i+=n;
j+=n;
/// mutam tatal in i
int tatai=tata(i),tataj=tata(j);
if(tatai<=n || tataj<=n) /// daca e conectat deja cu sirul initial
{
int radacina=min(tatai,tataj);
if(tatai<tataj)
{
maxx[j]=max(maxx[j],v[j-n]);
upd(radacina,j);
}
else
{
maxx[i]=max(maxx[i],v[i-n]);
upd(radacina,i);
}
poz=radacina;
val=maxx[radacina];
update(1,1,n);
}
else // simplu
{
upd(i,j);
maxx[i]=max(maxx[i],max( v[i-n],v[j-n]));
}
}
else
{
/// mutam iar tatal in i
int nod=j+n;
maxx[j+n]=max(maxx[j+n],v[j]);
upd(i,nod);
val=maxx[i];
poz=i;
update(1,1,n);
}
}
else
{
f>>a>>b;
rez=0;
query(1,1,n);
g<<rez<<"\n";
}
}
return 0;
}