Pagini recente » Istoria paginii runda/runda_4_petrica_se_balbaie_la_miting/clasament | Istoria paginii runda/oji_2008_10/clasament | Istoria paginii runda/viata_periculoasa_pe_infoarena/clasament | Cod sursa (job #2602639) | Cod sursa (job #2761795)
#include <fstream>
using namespace std;
#define MAX_N 5000010
int a[MAX_N],deque[MAX_N],n,i,k,x;
long long sum=0;
int main()
{
ifstream fin("deque.in");
ofstream fout("deque.out");
int fata=1,spate=0; //momentan deque este gol
fin>>n>>k;
for(i=1;i<=n;i++)
fin>>a[i];
for(i=1;i<=n;i++)
{
while(fata<=spate && a[i]<=a[deque[spate]]) // Cat timp elementul curent este mai mic decat ultimul element din deque
spate--; // eliminam pozitia ultimului element din deque
deque[++spate]=i; // Adaugam pozitia elementului curent in deque
if(deque[fata]==i-k) fata++; // Daca elementul minim este egal cu cel de pe pozita i-K
//ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if(i>=k) sum+=a[deque[fata]]; // Afisam minimul, acesta aflandu-se in varful deque-ului
}
fout<<sum;
fin.close();
fout.close();
return 0;
}