测试点情况有:TLE+RE+WA+AC
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,c[100005],f[100005],g[100005],v[100005][2],p[100005];
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&c[i]);
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++){
if(c[i]) f[i]=0,g[i]=i;
if(f[i>>1]>f[i]+1) f[i>>1]=f[i]+1,g[i>>1]=g[i];
}
ll ans=0;
for(int i=1;i<=m;i++){
scanf("%lld",&p[i]);
ll minn=2147483647,sum=0,pos,lca;
for(int j=p[i];j;j>>=1){
if(f[j]+sum<minn) minn=f[j]+sum,pos=g[j],lca=j;
sum+=(v[j][0]>0)?-1:1;
}
ans+=minn;
printf("%lld ",ans);
c[pos]--;
for(int j=p[i];j!=lca;j>>=1) v[j][0]?v[j][0]--:v[j][1]++;
for(int j=pos;j!=lca;j>>=1) v[j][1]?v[j][1]--:v[j][0]++;
for(int j=p[i];j!=lca;j>>=1){
f[j]=1<<30;
if(c[j]&&0<f[j]) f[j]=0,g[j]=j;
if((j<<1)<=n&&f[j<<1]+(v[j<<1][1]?-1:1)<f[j]){
f[j]=f[j<<1]+(v[j<<1][1]?-1:1);
g[j]=g[j<<1];
}
if((j<<1|1)<=n&&f[j<<1|1]+(v[j<<1|1][1]?-1:1)<f[j]){
f[j]=f[j<<1|1]+(v[j<<1|1][1]?-1:1);
g[j]=g[j<<1|1];
}
}
for(int j=pos;j;j>>=1){
f[j]=1<<30;
if(c[j]&&0<f[j]) f[j]=0,g[j]=j;
if((j<<1)<=n&&f[j<<1]+(v[j<<1][1]?-1:1)<f[j]){
f[j]=f[j<<1]+(v[j<<1][1]?-1:1);
g[j]=g[j<<1];
}
if((j<<1|1)<=n&&f[j<<1|1]+(v[j<<1|1][1]?-1:1)<f[j]){
f[j]=f[j<<1|1]+(v[j<<1|1][1]?-1:1);
g[j]=g[j<<1|1];
}
}
}
return 0;
}