Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ll inv1[MAX],inv2[MAX];int flag[MAX],arr[MAX];vi v[4*MAX];
- void Build(int node,int b,int e,int lev)
- {
- if(b==e)
- {
- v[node].pb(arr[b]);
- return ;
- }
- int mid = (b+e)>>1;
- int left = 2*node;
- int right = left + 1;
- Build(2*node,b,mid,lev+1);
- Build(2*node+1,mid+1,e,lev+1);
- ll l = 0,r = 0,cnt = 0;
- while(l<v[left].size()&&r<v[right].size())
- {
- int x = min(v[left][l],v[right][r]);ll cx = 0,cy = 0;
- while(l<v[left].size()&&v[left][l]==x)cx++,l++;
- while(r<v[right].size()&&v[right][r]==x)cy++,r++;
- inv2[lev]+=(cx * (v[right].size() - r));
- inv1[lev]+=(cy * (v[left].size() - l));
- for(int i = 0;i<cx+cy;i++)v[node].pb(x);
- }
- while(l<v[left].size())
- {
- v[node].pb(v[left][l++]);
- }
- while(r<v[right].size())
- {
- v[node].pb(v[right][r++]);
- }
- ///cout<<"node "<<node<<" "<<inv1[lev]<<" "<<inv2[lev]<<endl;;
- /// for(int i = 0;i<v[node].size();i++)cout<<v[node][i]<<" ";cout<<endl;
- }
- int main()
- {
- ///booster()
- ///read("input.txt");
- int n;
- scani(n);
- int m = 1<<n;
- for(int i = 1;i<=m;i++)scani(arr[i]);
- Build(1,1,m,0);
- ///for(int i = 0;i<=n;i++)cout<<inv1[i]<<" "<<inv2[i]<<endl;
- int q;
- scani(q);
- while(q--)
- {
- int pk;
- scani(pk);
- pk = n - pk;
- ll ans = 0;
- for(int i = pk;i<n;i++)
- {
- swap(inv1[i],inv2[i]);
- }
- for(int i = 0;i<n;i++)ans+=inv1[i];
- printf("%I64d\n",ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement