Pagini recente » Cod sursa (job #821300) | Cod sursa (job #863747) | Cod sursa (job #710172) | Cod sursa (job #1872135) | Cod sursa (job #2724885)
#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;
}