#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <algorithm>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
inline int getnum()
{
register char c=0;
while(!(c>='0' && c<='9') && c!='U' && c!='Q')
c=getchar();
if(c=='U')
return 0;
else if(c=='Q')
return 1;
register int a=0;
while(c>='0' && c<='9')
a=a*10+c-'0',c=getchar();
return a;
}
int val[205050],lv;
#define GetValMap(_a) (std::lower_bound(&val[1],&val[lv+1],_a)-&val[0])
int a[105050],pre[105050];
#define _SIZE 27778888
int cnt,root[105050],lson[_SIZE],rson[_SIZE];
long long smv[_SIZE];
int MP,MV;
void ModifyTree(int&o,register int l,register int r)
{
if(!o)
o=++cnt;
if(l==r)
{
smv[o]=MV;
return;
}
register int mid=(l+r)>>1;
if(MP <= mid)
ModifyTree(lson[o],l,mid);
else
ModifyTree(rson[o],mid+1,r);
smv[o]=smv[lson[o]]+smv[rson[o]];
}
int QL,QR;
long long _Qret;
void QueryTree(register int o,register int l,register int r)
{
if(!o)
return;
if(QL<=l && QR>=r)
{
_Qret+=smv[o];
return;
}
register int mid=(l+r)>>1;
if(QL <= mid)
QueryTree(lson[o],l,mid);
if(QR > mid)
QueryTree(rson[o],mid+1,r);
}
int N;
#define _lowbit(_x) ((_x)&-(_x))
inline void ModifyFTree(register int o)
{
//printf("modify %d, %d from %d to %d\n",o,MP,a[MP],MV);
o++;
while(o <= N)
{
ModifyTree(root[o],1,N);
o+=_lowbit(o);
}
}
inline long long QueryFTree(register int o)
{
//printf("query %d, [%d, %d]\n",o,QL,QR);
_Qret=0,o++;
while(o)
{
QueryTree(root[o],1,N);
o-=_lowbit(o);
}
return _Qret;
}
typedef __gnu_pbds::tree<int,__gnu_pbds::null_type> _t;
typedef _t::point_iterator _it;
_t pos[200005];
bool opt[105050];
int qx[105050],qy[105050];
int main()
{
register int N=getnum();
::N=N;
for(register int i=1;i<=N;i++)
val[++lv]=a[i]=getnum();
register int M=getnum();
for(register int i=1;i<=M;i++)
{
opt[i]=getnum(),qx[i]=getnum(),qy[i]=getnum();
if(opt[i] == 0)
val[++lv]=qy[i];
}
std::sort(&val[1],&val[lv+1]);
lv=std::unique(&val[1],&val[lv+1])-&val[0];
for(register int i=1,t;i<=N;i++)
{
_it it=pos[t=GetValMap(a[i])].insert(i).first;
pre[i]=(it==pos[t].begin() ? 0 : *(--it));
MP=i,MV=a[i],ModifyFTree(pre[i]);
}
for(register int i=1,t;i<=M;i++)
if(opt[i] == 0)
{
register int x=qx[i],y=qy[i];
_it nit=pos[t=GetValMap(a[x])].find(x),pit=nit++,it=pit--;
if(nit != pos[t].end())
{
MP=*nit,MV=0,ModifyFTree(pre[*nit]);
pre[*nit]=(it==pos[t].begin() ? 0 : *pit);
MP=*nit,MV=a[*nit],ModifyFTree(pre[*nit]);
}
pos[t].erase(it);
a[x]=y;
nit=pos[t=GetValMap(a[x])].insert(x).first,pit=nit++,it=pit--;
if(nit != pos[t].end())
{
MP=*nit,MV=0,ModifyFTree(pre[*nit]);
pre[*nit]=*it;
MP=*nit,MV=a[*nit],ModifyFTree(pre[*nit]);
}
MP=x,MV=0,ModifyFTree(pre[x]);
pre[x]=(it==pos[t].begin() ? 0 : *pit);
MP=x,MV=a[x],ModifyFTree(pre[x]);
}
else
QL=qx[i],QR=qy[i],printf("%lld\n",QueryFTree(qx[i]-1));
return 0;
}