#include <stdio.h>
#include <string.h>
#define MAX 3000002
int arr[10002],a[MAX];
//树状数组
int lowBit(int x)
{
return (x&(-x));
}
void add(int index,int val)
{
while(index<10001)
{
arr[index]+=val;
index+=lowBit(index);
}
}
int get(int num)
{
int sum=0;
while(num>0)
{
sum+=arr[num];
num-=lowBit(num);
}
return sum;
}
int main()
{
int n,m,i,x,y,temp;
char ch;
while(scanf("%d",&n)!=EOF)
{
_int64 ans=0;
memset(arr,0,sizeof(arr));
memset(a,0,sizeof(a));
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(a[i],1);
ans+=get(a[i]-1);//a[i]前面比a[i]小的数的和
}
scanf("%d",&m);
while(m--)
{
getchar();
scanf("%c",&ch);
if(ch=='Q')
printf("%I64d\n",ans);
else
{
scanf("%d %d",&x,&y);
x++;//树状数组下标从1开始
y++;
temp=a[x];
for(i=x;i<y;i++)
{
a[i]=a[i+1];
if(a[i]>temp)
ans--;
else if(a[i]<temp)
ans++;
}
a[y]=temp;
}
}
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define MAX 3000002
int arr[10002],a[MAX];
int Scan()// 该外挂适合纯数字输入
{
int res = 0, ch, flag = 0;
if((ch = getchar()) == '-') //判断正负
flag = 1;
else if(ch >= '0' && ch <= '9') //得到完整的数
res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9' )
res = res * 10 + ch - '0';
return flag ? -res : res;
}
int lowBit(int x)
{
return (x&(-x));
}
void add(int index,int val)
{
while(index<10001)
{
arr[index]+=val;
index+=lowBit(index);
}
}
int get(int num)
{
int sum=0;
while(num>0)
{
sum+=arr[num];
num-=lowBit(num);
}
return sum;
}
int main()
{
int n,m,i,x,y,temp;
char ch;
while(scanf("%d",&n)!=EOF)
{
_int64 ans=0;
memset(arr,0,sizeof(arr));
for (i=1;i<=n;i++)
{
a[i]=Scan();
add(a[i],1);
ans+=get(a[i]-1);//a[i]前面比a[i]小的数的和
}
scanf("%d",&m);
while(m--)
{
getchar();
ch=getchar();
if(ch=='Q')
printf("%I64d\n",ans);
else
{
scanf("%d %d",&x,&y);
x++;//树状数组下标从1开始
y++;
temp=a[x];
for(i=x;i<y;i++)
{
a[i]=a[i+1];
if(a[i]>temp)
ans--;
else if(a[i]<temp)
ans++;
}
a[y]=temp;
}
}
}
return 0;
}