rt,讨论区里的样例试过没错。思路是时间倒流,把操作改为插入数字后,做前缀和求答案。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0,f=1;
char c=getchar();
while(c<'0'||'9'<c){
if(c=='-') f=-1;
c=getchar();
}
while('0'<=c&&c<='9'){
ret=(ret<<1)+(ret<<3)+(int)(c-'0');
c=getchar();
}
return ret*f;
}
inline long long readll(){
long long ret=0ll,f=1ll;
char c=getchar();
while(c<'0'||'9'<c){
if(c=='-') f=-1ll;
c=getchar();
}
while('0'<=c&&c<='9'){
ret=(ret<<1ll)+(ret<<3ll)+(long long)(c-'0');
c=getchar();
}
return ret*f;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10) write(x/10);
putchar('0'+x%10);
}
inline void writell(long long x){
if(x<0ll){
putchar('-');
x=-x;
}
if(x>=10ll) writell(x/10ll);
putchar('0'+x%10ll);
}
typedef long long LL;
#define int long long
const int NR=1e5+5;
int n,m;
int _pos[NR];
struct Node{
int pos,v;
}a[NR];
int t[2][NR];
inline int lowbit(int x){
return x&(-x);
}
inline void add(int x,int k,int num){
while(x<=NR-5){
t[num][x]+=k;
x+=lowbit(x);
}
}
inline int sum(int x,int num){
int ret=0;
while(x!=0){
ret+=t[num][x];
x-=lowbit(x);
}
return ret;
}
inline bool cmp1(int x,int y){
return a[x].pos<a[y].pos;
}
inline bool cmp2(int x,int y){
return a[x].pos>a[y].pos;
}
int top=0;
int tmp[2][NR],ans[NR];
inline void cdq(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
top=0;
for(int i=l;i<=r;i++){
top++;
tmp[0][top]=tmp[1][top]=i;
}
//比自己靠前而且比自己大的
sort(tmp[0]+1,tmp[0]+top+1,cmp1);
for(int i=1,pos;i<=top;i++){
pos=tmp[0][i];
if(pos<=mid){
add(NR-5-a[pos].v,1,0);
}else{
ans[pos]+=sum(NR-5-a[pos].v,0);
}
}
//比自己靠后而且比自己小的
sort(tmp[1]+1,tmp[1]+top+1,cmp2);
for(int i=1,pos;i<=top;i++){
pos=tmp[1][i];
if(pos<=mid){
add(a[pos].v,1,1);
}else{
ans[pos]+=sum(a[pos].v,1);
}
}
for(int i=1,pos;i<=top;i++){
pos=tmp[0][i];
if(pos<=mid){
add(NR-5-a[pos].v,-1,0);
add(a[pos].v,-1,1);
}
}
cdq(l,mid);cdq(mid+1,r);
}
bool flag[NR];
signed main(){
// ios::sync_with_stdio(false);
n=read();m=read();
for(int i=1;i<=n;i++) _pos[read()]=i;
for(int i=1,ix;i<=m;i++){
ix=read();
flag[ix]=true;
a[i]=Node{_pos[ix],ix};
}
int pos=1;
for(int i=m+1;i<=n;i++){
while(flag[pos]) pos++;
a[i]=Node{_pos[pos],pos};
}
for(int i=1;i<=(n>>1);i++){
swap(a[i],a[n-i+1]);
}
cdq(1,n);
for(int i=1;i<=n;i++){
ans[i]+=ans[i-1];
}
for(int i=n;i>=n-m+1;i--){
writell(ans[i]);putchar('\n');
}
return 0;
}