#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #define N 10001 #define M 3000001 using namespace std; int kp[M]; int s[N]; int n; int lowbit(int x) {return x&(-x);} void update(int x) { while(x<N) { s[x]++; x+=lowbit(x); } } int Quary(int x) { int sum=0; while(x>0) { sum+=s[x]; x-=lowbit(x); } return sum; } int main() { while(~scanf("%d",&n)) { int m; memset(s,0,sizeof(s)); memset(kp,0,sizeof(kp)); long long res=0; for(int i=0;i<n;++i) { scanf("%d",&kp[i]); update(kp[i]);//插入kp[i]; res+=Quary(kp[i]-1);//统计共有多少个比kp[i]小的元素 } scanf("%d",&m); char ch[3]; for(int i=0;i!=m;++i) { scanf("%s",ch); if(ch[0]=='Q') printf("%I64d\n",res); else { int a,b; scanf("%d%d",&a,&b); int k=kp[a]; for(int j=a;j<b;++j) { kp[j]=kp[j+1]; if(kp[j]<k) res++; else if(kp[j]>k) res--; } kp[b]=k; } } }return 0; } //树状数组求正序数:找当i<j时严格有a[i]<a[j]共有多少对 //其中题中给了两种操作当输入的ch为Q时查寻当前有多少对,当输入的ch为R时,输入a,b,从a开始到b一次前移一个位置而a移到b位置。