R表示k1--k2依次向左循环1位 Q:查询多少升序序列
- #include <cstdio>
- #include <cstring>
- using namespace std;
- #define maxn 3000005
- int arr[10005],a[maxn];
- int lowbit(int x)
- {
- return x&(-x);
- }
- void update(int x,int val)
- {
- while(x<10001)
- {
- arr[x]+=val;
- x+=lowbit(x);
- }
- }
- int getsum(int x)
- {
- int ans=0;
- while(x>0)
- {
- ans+=arr[x];
- x-=lowbit(x);
- }
- return ans;
- }
- int main()
- {
- __int64 ans;
- int i,j,n,m,x,y;
- char c;
- while(scanf("%d",&n)!=EOF)
- {
- ans=0;
- memset(arr,0,sizeof(arr));
- memset(a,0,sizeof(a));
- for(i=1;i<=n;i++)
- {
- scanf("%d",&a[i]);
- update(a[i],1);
- ans+=getsum(a[i]-1);
- }
- scanf("%d",&m);
- while(m--)
- {
- getchar();
- scanf("%c",&c);
- if(c=='Q') printf("%I64d\n",ans);
- if(c=='R')
- {
- scanf("%d%d",&x,&y);
- x++;y++;
- int temp=a[x];
- for(i=x;i<y;i++)
- {
- a[i]=a[i+1];
- if(a[i]>temp) ans--;
- if(a[i]<temp) ans++;
- }
- a[y]=temp;
- }
- }
- }
- return 0;
- }