#pragma once
#include"../data-structure/binary-indexed-tree.hpp"// 転倒数template<typenameT>longlonginversion_counting(constvector<T>&v){vector<T>xs{v};sort(begin(xs),end(xs));xs.erase(unique(begin(xs),end(xs)),end(xs));ints=xs.size();BinaryIndexedTree<longlong>bit(s+1);longlongans=0;for(auto&x:v){inti=lower_bound(begin(xs),end(xs),x)-begin(xs);if(i+1!=s)ans+=bit.sum(i+1,s-1);bit.add(i,1);}returnans;}// 隣接 swap によって v を w に変えるのにかかる手数 (不可能 : -1)template<typenameT>longlongswap_distance(constvector<T>&v,constvector<T>&w){if(v.size()!=w.size())return-1;intN=v.size();vector<pair<T,int>>vv(N),ww(N);for(inti=0;i<N;i++){vv[i]=make_pair(v[i],i);ww[i]=make_pair(w[i],i);}sort(begin(vv),end(vv));sort(begin(ww),end(ww));for(inti=0;i<N;i++){if(vv[i].first!=ww[i].first)return-1;}vector<int>order(N);for(inti=0;i<N;i++){order[vv[i].second]=ww[i].second;}returninversion_counting(order);}
#line 2 "dp/inversion-counting.hpp"
#line 2 "data-structure/binary-indexed-tree.hpp"
template<typenameT>structBinaryIndexedTree{intN;vector<T>data;BinaryIndexedTree()=default;BinaryIndexedTree(intsize){init(size);}voidinit(intsize){N=size+2;data.assign(N+1,{});}// get sum of [0,k]Tsum(intk)const{if(k<0)returnT{};// return 0 if k < 0Tret{};for(++k;k>0;k-=k&-k)ret+=data[k];returnret;}// getsum of [l,r]inlineTsum(intl,intr)const{returnsum(r)-sum(l-1);}// get value of kinlineToperator[](intk)const{returnsum(k)-sum(k-1);}// data[k] += xvoidadd(intk,Tx){for(++k;k<N;k+=k&-k)data[k]+=x;}// range add x to [l,r]voidimos(intl,intr,Tx){add(l,x);add(r+1,-x);}// minimize i s.t. sum(i) >= wintlower_bound(Tw){if(w<=0)return0;intx=0;for(intk=1<<__lg(N);k;k>>=1){if(x+k<=N-1&&data[x+k]<w){w-=data[x+k];x+=k;}}returnx;}// minimize i s.t. sum(i) > wintupper_bound(Tw){if(w<0)return0;intx=0;for(intk=1<<__lg(N);k;k>>=1){if(x+k<=N-1&&data[x+k]<=w){w-=data[x+k];x+=k;}}returnx;}};/**
* @brief Binary Indexed Tree(Fenwick Tree)
* @docs docs/data-structure/binary-indexed-tree.md
*/#line 4 "dp/inversion-counting.hpp"
// 転倒数template<typenameT>longlonginversion_counting(constvector<T>&v){vector<T>xs{v};sort(begin(xs),end(xs));xs.erase(unique(begin(xs),end(xs)),end(xs));ints=xs.size();BinaryIndexedTree<longlong>bit(s+1);longlongans=0;for(auto&x:v){inti=lower_bound(begin(xs),end(xs),x)-begin(xs);if(i+1!=s)ans+=bit.sum(i+1,s-1);bit.add(i,1);}returnans;}// 隣接 swap によって v を w に変えるのにかかる手数 (不可能 : -1)template<typenameT>longlongswap_distance(constvector<T>&v,constvector<T>&w){if(v.size()!=w.size())return-1;intN=v.size();vector<pair<T,int>>vv(N),ww(N);for(inti=0;i<N;i++){vv[i]=make_pair(v[i],i);ww[i]=make_pair(w[i],i);}sort(begin(vv),end(vv));sort(begin(ww),end(ww));for(inti=0;i<N;i++){if(vv[i].first!=ww[i].first)return-1;}vector<int>order(N);for(inti=0;i<N;i++){order[vv[i].second]=ww[i].second;}returninversion_counting(order);}