Pagini recente » Cod sursa (job #2128681) | Cod sursa (job #2453477) | Cod sursa (job #48497) | Cod sursa (job #3157470) | Cod sursa (job #1151706)
#include <iostream>
#include <fstream>
#include <algorithm>
#define DN 100005
#define LL long long
using namespace std;
ifstream f("pikachu.in");
ofstream g("pikachu.out");
struct stru{
int ind,val;
};
int n,k,v[DN],mp[DN],poz,val,st,p[4*DN],ins,med;
LL arb[4*DN],S,rez = (1ll<<60);
stru c[DN];
void update(int nod,int left,int right){
if(left == right){
arb[nod] = val;
p[nod] = ins;
return;
}
int mij =(left+right)/2;
if( poz <= mij ) update(2*nod,left,mij);
else update(2*nod+1,mij+1,right);
arb[nod] = arb[2*nod] + arb[2*nod+1];
p[nod] = p[2*nod] + p[2*nod + 1];
}
void search(int nod,int left,int right){
if(left == right){
S+=arb[nod];
med = arb[nod];
return;
}
int mij =(left+right)/2;
if( p[ 2*nod ] >= st ){
search(2*nod,left,mij);
}else{
/// sar peste stanga
st -= p[2*nod];
S += arb[2*nod];
search(2*nod+1,mij+1,right);
}
}
bool cmp(stru a,stru b){
return a.val < b.val;
}
void read(){
f>>n>>k;
for(int i=1;i<=n;++i){
f>>v[i];
c[i].ind = i;
c[i].val = v[i];
}
}
void init(){
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;++i)
mp[ c[i].ind ] = i; /// pe a cata pozitie trebuie pus elementul cu indicele i in arb
}
void fnd(int x){
st = x;
S = 0;/// sum_left
search(1,1,n);
LL D = arb[1] - S;
rez = min(rez , (x)*1ll*med - S + D - (k - x)*1ll*med );
}
void solve(){
init();
for(int i=1;i<k;++i){
poz = mp[ i ];
val = v[ i ];
ins = 1;
update(1,1,n);
}
for(int i=k;i<=n;++i){
/// insert
poz = mp[ i ];
val = v[ i ];
ins = 1;
update(1,1,n);
/// erase i-k
if(i-k>=1){
poz = mp[ i-k ];
val = 0;
ins = 0;
update(1,1,n);
}
/// search
fnd(k/2);
fnd(k/2+1);
// cout<<i-k+1<<" "<<k<<
}
g<<rez;
}
int main()
{
read();
solve();
return 0;
}