Cod sursa(job #2724885)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 18 martie 2021 00:37:48
Problema Deque Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>

using namespace std;
ifstream fin("vila2.in");
ofstream fout("vila2.out");

int n,k,v[100001];
int deque_max[50001],deque_min[50001];
int front_min, back_min;
int front_max, back_max;

void Read()
{
    fin>>n>>k;
    for(int i=0;i<n;i++)
        fin>>v[i];

    fin.close();
}
void Do()
{
    ///calculez minimul si maximul pe secvente de k+1 elemente folosind deque

    //pastrez in deque pozitiile si nu valorile
    // pentru a putea tine cont cand se misca "pointerul" peste secventa
    int current,maxim,minim,diferenta=0;

    //initializare
    front_min=front_max=0;
    back_min=back_max=-1;

    for(int i=0;i<n;i++)
    {
       current=v[i];
       while(front_min<=back_min && current<=v[deque_min[back_min]])
           back_min--; //elimin elementele mai mari (sau egale!)  decat cel curent
           //pentru a pastra in deque minimele
       //adaug curentul in deque
       deque_min[++back_min]=i;

       if(deque_min[front_min]==i-(k+1)) //minimul curent nu mai face parte din noua secventa (i,i-1,...,i-(k-1))
           front_min++;

       minim=v[deque_min[front_min]];

       ///similar pentru maxim
       while(front_max<=back_max && current>=v[deque_max[back_max]])
           back_max--;
       deque_max[++back_max]=i;

       if(deque_max[front_max]==i-(k+1)) //maximul curent nu mai face parte din noua secventa (i,i-1,...,i-(k-1))
           front_max++;

       maxim=v[deque_max[front_max]];
       diferenta=max(abs(minim-maxim),diferenta);


    }

  fout<<diferenta;

}
int main()
{
    Read();
    Do();


    return 0;
}