Pagini recente » Cod sursa (job #2854864) | Cod sursa (job #3357593) | Cod sursa (job #1498098) | Borderou de evaluare (job #2732551) | Cod sursa (job #3343487)
#include <fstream>
#define int long long
const int NMAX=1000005;
const int LOG=21;
using namespace std;
ifstream cin("deque.in");
ofstream cout("deque.out");
int v[NMAX];
int mini[LOG][NMAX],lg[NMAX]; ///[.....][.....]
/// mini[j][i] = minimul din intervalul i...i+(2^j)-1 = i...i+2^2-1
/// mini[1][i] = min(i..i+1)
/// mini[j][i] = min(mini[j-1][i],mini[j-1][i+2^(j-1)])
/// i<=k1<=k2<=j, min(i...j) = min(min(i..k2),min(k1...j))
int query(int st,int dr)
{
int j=lg[dr-st+1];
return min(mini[j][st],mini[j][dr-((1<<j)-1)]);
}
signed main()
{
int n,k;
cin>>n>>k;
int pow2=1,cnt=0;
for(int i=1;i<=n;i++)
{
cin>>v[i];
mini[0][i]=v[i];
//--------------
lg[i]=cnt;
if(pow2*2==i)
{
pow2*=2;
cnt++;
}
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
mini[j][i]=min(mini[j-1][i],mini[j-1][i+(1<<(j-1))]);
}
}
int sum=0;
for(int i=1;i<=n-k+1;i++)
{
int st=i,dr=i+k-1;
sum+=query(st,dr);
}
cout<<sum<<endl;
return 0;
}