Pagini recente » Cod sursa (job #1430364) | Cod sursa (job #521630) | Cod sursa (job #2002966) | Cod sursa (job #2338914) | Cod sursa (job #2657922)
#include <cstdio>
#include <algorithm>
#define maxN 5120000
using namespace std;
struct Nrs {
long long int value,pos;
}v[maxN];
long long int n,k,filled[maxN],filledNr,p2;
void read() {
Nrs NewNr;
scanf("%lld%lld",&n,&k);
for(NewNr.pos=0;NewNr.pos<n;++NewNr.pos) {
scanf("%lld",&NewNr.value);
v[NewNr.pos]=NewNr;
}
}
bool cmp(Nrs X,Nrs Y) {
return X.value<Y.value;
}
void fixBinSrch() {
for(p2=1;p2<=(k+k-1);p2<<=1);
p2>>=1;
}
void binSrch(int fst,int lst,int&start,int&stop) {
if(fst<k-1) {
fst=k-1;
}
if(lst>=n) {
lst=n;
}
if(filled[fst]==1) {
if(filled[lst-1]==1) {
int i;
for(start=-1,i=fst;i<lst;++i) {
if(!filled[i]) {
start=i;
break;
}
}
for(stop=-1;i<lst;++i) {
if(filled[i]) {
stop=i;
break;
}
}
if(stop==-1) {
start=0;
stop=0;
}
}
else {
int i,p;
for(i=fst,p=p2;p;p>>=1) {
if(i+p<n&&filled[i+p]) {
i+=p;
}
}
start=i+1;
stop=lst;
}
}
else {
if(filled[lst]==1) {
int i,p;
for(i=fst,p=p2;p;p>>=1) {
if(i+p<n&&!filled[i+p]) {
i+=p;
}
start=fst;
stop=i+1;
}
}
else {
start = fst;
stop = lst;
}
}
}
int fill(int xpos) {
int i,start,stop;
binSrch(xpos,xpos+k,start,stop);
for(i=start;i<stop;++i) {
filled[i]=1;
}
if(stop-start>0) {
return stop-start;
}
else {
return 0;
}
}
void solve() {
long long int sol,i,newfiledNr;
fixBinSrch();
for(i=0,sol=0,filledNr=0;filledNr<n-k+1;sol+=newfiledNr*v[i].value,filledNr+=newfiledNr,++i) {
newfiledNr=fill(v[i].pos);
}
printf("%lld",sol);
}
int main() {
freopen("deque.in","r",stdin);
freopen("deque.out","w",stdout);
read();
sort(v,v+n,cmp);
solve();
return 0;
}