ソート(並べ替え)
[問題の説明]
小さなA.の前に立って順番にn個の個人があります。小さなターンこれは、m個の個々の動作をnとします。
各操作は、位置kを選択するために、すべてのこれらのN個の個々の高さは、現在の位置kに等しい未満であります
ランクから引き出され、その後、挿入するために、左から右へ順にローからハイへの上昇をたどる人の身長
元の位置の間でこれらの人々。
これらのN個の個々の高さの小さな逆シーケンスが非常に興味を持って構成されています。小さなは今、すべてを知りたいです
操作の逆の順序の後の数値。
[入力形式]
二つの整数n及びmの最初の行、およびオペランドの数を表します。
次の行nは整数AIは、左から右に一人一人の身長の初期状態を表しています。
次に、各m行の数は、kがこの操作を表します。
[出力形式]
出力コモン線m + 1は、ライン1が逆ないときの動作での数を表します。
最初のi行以外は、I-1は、逆の操作後の対数配列を表します。
[サンプル入力]
6 2
160 163 164 161 167 160
2
3
[サンプル出力]
6
3
1
サンプル[解説]
初めて160163161160を持ち出し
160 160,164,161,167,163の動作シーケンスの後
第二は、160,160,164,161,163を持ち出し
動作のシーケンスは、160 160,160,161,167,163た後
[データ範囲]
データの30%を、N、m≤500
データの60%を、N、m≤1000
100%のデータ、N、m≤300000,1≤k≤n,,1≤ai≤10^ 9
ゾル:ファンシー配信ポイント、彼らは答えには影響しないので、おそらく現在のサイズの前に、我々は、コントロールを持っていません
#include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();} while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();} return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) {putchar('-'); x=-x;} if(x<10) {putchar(x+'0'); return;} write(x/10); putchar((x%10)+'0'); } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') const ll N=300005; ll n,m; struct Node { ll id,num,val; }a[N]; inline bool cmpnum(Node a,Node b){return a.num<b.num;} inline bool cmpid(Node a,Node b){return a.id<b.id;} struct BIT { ll S[N<<1]; #define lowbit(x) ((x)&(-x)) inline void Ins(int x,int v) { while(x<=n) { S[x]+=v; x+=lowbit(x); } } inline int Que(int x) { ll ans=0; while(x>0) { ans+=S[x]; x-=lowbit(x); } return ans; } }T,BT; signed main() { freopen("sort.in","r",stdin); freopen("sort.out","w",stdout); ll i,cv=0,ans=0,now=0,oo; R(n); R(m); for(i=1;i<=n;i++) R(a[a[i].id=i].num); sort(a+1,a+n+1,cmpnum); a[1].val=++cv; for(i=2;i<=n;i++) { if(a[i].num==a[i-1].num) a[i].val=cv; else a[i].val=++cv; } sort(a+1,a+n+1,cmpid); for(i=n;i>=1;i--) { ans+=(oo=T.Que(a[i].val-1)); BT.Ins(a[i].val,oo); T.Ins(a[i].val,1); } Wl(ans); for(i=1;i<=m;i++) { ll pos; R(pos); if(now<a[pos].val) { ans-=(BT.Que(a[pos].val)-BT.Que(now)); now=a[pos].val; } Wl(ans); } return 0; } /* input 6 2 160 163 164 161 167 160 2 3 output 6 3 1 */