#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; }