Mai intai trebuie sa te autentifici.
Cod sursa(job #2074474)
Utilizator | Data | 24 noiembrie 2017 17:27:39 | |
---|---|---|---|
Problema | Deque | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
#include <iostream>
#include <fstream>
using namespace std;
int n[5000010];
int exp[5000010];
int capat;
int nr,k;
long long suma;
void stergere_stanga(int i)
{
int j;
for(j=0; j<=capat-i; j++)
{
n[j]=n[j+i];
exp[j]=exp[j+i];
}
capat-=i;
}
void stergere_dreapta(int i)
{
capat-=i;
}
void verificare_dreapta(int x){
int j=0;
int c=capat;
while(x<=n[c]){j++;c--;}
if(j>0)stergere_dreapta(j);
}
void verificare_stanga(int x){
int j=0;
int c=0;
while(x<=n[c]){
j++;
c++;
}
if(j>0)stergere_stanga(j);
}
void update()
{
for(int t=0; t<=capat; t++)exp[t]--;
if(exp[0]==0)stergere_stanga(1);
}
int minim()
{
int min=n[0];
for(int i=0; i<=capat; i++)if(n[i]<min)min=n[i];
return min;
}
void adaugare(int x){
if(x<minim()){n[0]=x;exp[0]=k;capat=0;}
else{
verificare_dreapta(x);
verificare_stanga(x);
capat++;
if(capat<0){capat=0;cout<<"coada goala "<<x;}
n[capat]=x;
exp[capat]=k;
update();}
}
int main()
{capat=0;
ifstream a("deque.in");
ofstream b("deque.out");
a>>nr>>k;
a>>n[0];
exp[0]=k;
int c;
for(int i=1;i<k;i++){
a>>c;
adaugare(c);
}
int suma=minim();
for(int i=k;i<=nr;i++){
a>>c;
adaugare(c);
suma+=minim();
}
b<<suma;
return 0;
}