WA了。。。
总的逆序对没有错(样例),后面要用后缀和时就WA了样例的一个输出。交上去全WA。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 3000010
int a2[maxn],b[maxn],c[maxn],cnt,answer,change[maxn],n,m,q,ans1=-6,ans2;
struct node {
int h,v,pos;
} a[maxn];
bool cmp(const node & x,const node & y) {
return x.h<y.h;
}
inline int lowbit(int x) {
return x&-x;
}
inline void add(int x,int val) {
for(; x<=n; x+=lowbit(x))c[x]+=val;
}
inline int sum(int x) {
int res=0;
for(; x; x-=lowbit(x))res+=c[x];
return res;
}
void lisan() {
sort(a2+1,a2+1+cnt);
cnt=unique(a2+1,a2+1+cnt)-a2-1;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(register int i=1; i<=n; i++) {
scanf("%lld",&a[i].h);
a[i].pos=i;a2[++cnt]=a[i].h;
}
lisan();
for(register int i=n; i>=1; i--) {
a[i].h=lower_bound(a2+1,a2+cnt+1,a[i].h)-a2;
a[i].v=sum(a[i].h);
answer+=a[i].v;
add(a[i].h,1);
}
printf("%lld\n",answer);
sort(a+1,a+n+1,cmp);
for(register int i=n-1; i>=1; i--)a[i].v+=a[i+1].v;
for(register int i=1; i<=n; i++)change[a[i].pos]=1;
for(register int i=1; i<=m; i++) {
scanf("%lld",&q);
if(a[change[q]].h>ans1) {
printf("%lld\n",a[change[q]+1].v);
ans1=a[change[q]].h;
ans2=q;
} else printf("%lld\n",a[change[ans2]+1].v);
}
}