Cod sursa(job #660370)

Utilizator cristibBalu Cristian cristib Data 12 ianuarie 2012 18:36:17
Problema Secventa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<stdio.h>
#include<deque>
using namespace std;
int v[500001];
deque<int>c;
#define DIM 8192
char buff[DIM+16];
int pz;
inline void citeste(int &x)
{
            x=0;
            while((buff[pz]<'0' || buff[pz]>'9') && (buff[pz]!='-'))
                        if(++pz==DIM)fread(buff, 1, DIM, stdin), pz=0;
            
            int neg=0;
            if(buff[pz]=='-')
            {
                        neg=1;
                        if(++pz==DIM)fread(buff, 1, DIM, stdin),pz=0;
            }
            
            while(buff[pz]>='0' && buff[pz]<='9')
            {
                        x=x*10+buff[pz]-'0';
                        if(++pz==DIM)fread(buff,1, DIM, stdin),pz=0;
            }
            if(neg) x=-x;
}
int main()
{
	int N,K,i,inceput_coada,sfarsit_coada,min_coada,inceput_max,sfarsit_max,x,y;
	freopen("secventa.in","r",stdin);
	freopen("secventa.out","w",stdout);
	scanf("%d%d",&N,&K);
	citeste(x);
	v[1]=x;
	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++)
	{
	    citeste(v[i]);
		if(sfarsit_coada-inceput_coada+1<K)
		{
			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)
			{
				while(c.size()&&v[i]<c.back())
						c.pop_back();
				if(c.size()&&c.front()==v[inceput_coada])
					c.pop_front();
				inceput_coada++;
				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;
}