Cod sursa(job #656203)

Utilizator an_drey_curentandreycurent an_drey_curent Data 4 ianuarie 2012 12:27:29
Problema Secventa Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
#include<deque>
using namespace std;
int v[500001];
deque<int>c;
#define DIM 10000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
     numar = 0;
     char semn='+';     
     while (buff[poz] < '0' || buff[poz] > '9')
     {     
          semn = buff[poz];
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     }          
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
     if (semn == '-')
          numar = -numar;
}
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);
	fgets(buff,10,stdin);
	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++)
	{
		fgets(buff,10,stdin);
	    citeste(x);
	    v[i]=x;
		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;
}