Cod sursa(job #656170)

Utilizator an_drey_curentandreycurent an_drey_curent Data 4 ianuarie 2012 02:11:31
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>
#include<deque>
using namespace std;
int v[500001];
deque<int>c;
int main()
{
	int N,K,i,inceput_coada,sfarsit_coada,min_coada,inceput_max,sfarsit_max,x;
	freopen("secventa.in","r",stdin);
	freopen("secventa.out","w",stdout);
	scanf("%d%d",&N,&K);
	scanf("%d",&v[1]);
	c.push_back(v[1]);
	inceput_coada=1;
	sfarsit_coada=1;
	inceput_max=1;
	sfarsit_max=1;
	min_coada=-31000;
	for(i=2;i<=N;i++)
	{
		scanf("%d",&v[i]);
		if(sfarsit_coada-inceput_coada+1<K)
		{
			while(c.size()&&v[i]<=c.front())
				c.pop_front();
			while(c.size()&&v[i]<=c.back())
				c.pop_back();
			c.push_back(v[i]);
			sfarsit_coada++;
		}
		else
		if(sfarsit_coada-inceput_coada+1==K)
		{
			x=c.front();
			if(min_coada<x)
			{
				min_coada=c.front();
				inceput_max=inceput_coada;
				sfarsit_max=sfarsit_coada;
			}
			if(v[i]>=x)
			{
				if(c.size()>1&&K>1)
				while(c.size()&&sfarsit_coada-inceput_coada+1>=K&&v[i]>=c.front())
				{
					c.pop_front();
					inceput_coada++;
				}
				if(c.size()>1&&K>1)
				while(c.size()&&v[i]<=c.back())
						c.pop_back();
				c.push_back(v[i]);
				sfarsit_coada++;
			}
			else
			{
				while(c.size())
					c.pop_back();
				c.push_back(v[i]);
				inceput_coada=i;
				sfarsit_coada=i;
			}
		}
	}
	if(sfarsit_coada-inceput_coada+1>=K)
		if(min_coada<c.front())
		{
			min_coada=c.front();
			inceput_max=inceput_coada;
			sfarsit_max=sfarsit_coada;
		}
	printf("%d %d %d",inceput_max,sfarsit_max,min_coada);
	return 0;
}