#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位置。
http://acm.hdu.edu.cn/showproblem.php?pid=2688&&树状数组求正序数
最新推荐文章于 2022-08-20 10:32:02 发布