Cod sursa(job #1193828)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 1 iunie 2014 23:15:00
Problema Deque Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.6 kb
#include <fstream>
#include <iostream>
using namespace std;
#define ERR -2000000001
#define MAX 5000001
struct nod{
    int info;
    nod *urm, *ant;
};
struct dequee{
    int size;
    nod *prim, *ult;
} deq;
void push_back(dequee &q, int x);
void push_front(dequee &q, int x);
void pop_front(dequee &q);
void pop_back(dequee &q);
bool empty(dequee q){return q.size==0;}
int front(dequee q);
int back(dequee q);
void afis(dequee q);
int n, k, v[MAX];
ifstream fin("deque.in");
ofstream fout("deque.out");
int main()
{
    int i, x;
    long long rez=0;
    fin>>n>>k;
    for(i=1; i<=n; i++)
        fin>>v[i];
    for(i=1; i<=n; i++){
        while(!empty(deq) and v[i]<=v[back(deq)])
            pop_back(deq);
        if(!empty(deq) and i-k==front(deq))
            pop_front(deq);
        push_back(deq, i);
        if(i>=k)
            rez = rez + v[front(deq)];
    }
    fout<<rez;
    return 0;
}
int front(dequee q){
    if(q.size==0){
        cout<<"GOL\n";
        return ERR;
    }
    return q.prim->info;
}
int back(dequee q){
    if(q.size==0){
        cout<<"GOL\n";
        return ERR;
    }
    return q.ult->info;
}
void pop_back(dequee &q){
    if(q.size==0){
        cout<<"GOL\n";
        return;
    }
    if(q.size==1){
        delete q.prim;
        q.size = 0;
        q.prim = q.ult = NULL;
        return;
    }
    nod *desters = q.ult;
    q.ult = q.ult->ant;
    q.ult->urm = NULL;
    q.size--;
    delete desters;
    return;
}
void pop_front(dequee &q){
    if(q.size==0){
        cout<<"GOL\n";
        return;
    }
    if(q.size==1){
        delete q.prim;
        q.size = 0;
        q.prim = q.ult = NULL;
        return;
    }
    nod *desters = q.prim;
    q.prim = q.prim->urm;
    q.prim->ant = NULL;
    q.size--;
    delete desters;
    return;
}
void push_front(dequee &q, int x){
    nod *nou = new nod;
    nou->info = x;
    nou->urm = q.prim;
    nou->ant = NULL;
    if(q.size==0) //coada goala asa ca ultimul este si primul
        q.ult = nou;
    else
        q.prim->ant = nou; //altfel adresa ultimului arata catre nou
    q.prim = nou;
    q.size++;
}
void push_back(dequee &q, int x){
    nod *nou = new nod;
    nou->info = x;
    nou->urm = NULL;
    nou->ant = q.ult;
    if(q.size==0) //coada goala asa ca primul este si ultimul
        q.prim = nou;
    else
        q.ult->urm = nou; //altfel adresa ultimului arata catre nou
    q.ult = nou;
    q.size++;
}
void afis(dequee q)
{
    nod *p=q.prim;
    while(p){
        fout<<p->info<<' ';
        p = p->urm;
    }
}