Cod sursa(job #215410)

Utilizator AthanaricCirith Gorgor Athanaric Data 18 octombrie 2008 16:36:25
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <string.h>
char cz[3000010];
int n,p,v[500005],coada[500005],pr,ul;
void citirith()
{
	int i=0,q=0,x,semn;
	scanf("%d%d\n",&n,&p);
	gets(cz); x=0; semn=1;
	for (i=0; cz[i]!='\n' && cz[i]!='\0'; ++i)
	{
		if (cz[i]==' ')
		{
			v[++q]=x*semn;
			x=0;
			semn=1;
		}
		if (cz[i]=='-')
			semn=-1;
		if (cz[i]>='0'&&cz[i]<='9')
			x=x*10+cz[i]-'0';
	}
	v[++q]=x*semn;
	for (int i=1; i<=n; i++)
		printf("%d ",v[i]);
	printf("\n");
}
int caut(int x)
{
	int m,st=pr,dr=ul;
	while (st!=dr)
	{
		m=(st+dr)/2;
		if (x>v[coada[m]])
			st=m+1;
		else
			dr=m;
	}
	if(x>v[coada[st]])
		++st;
	return st;
}
	
void rezolvarith()
{
	int sol=-31000,poz=0,st,dr;
	pr=1;
	coada[++ul]=1;
	for (int i=2; i<=n; i++)
	{
		while (i-coada[pr]+1>p)
			++pr;
		poz=caut(v[i]);
		ul=poz;
		coada[ul]=i;
		if (v[coada[pr]]>sol && i>=p)
		{
			st=i-p+1;
			dr=i;
			sol=v[coada[pr]];
		}
	}
	printf("%d %d %d\n",st,dr,sol);
}
int main()
{
	freopen("secventa.in","r",stdin);
	freopen("secventa.out","w",stdout);
	citirith();
	rezolvarith();
	return 0;
}