Cod sursa(job #580471)

Utilizator PatrikStepan Patrik Patrik Data 13 aprilie 2011 08:59:32
Problema Secventa Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
	#include<stdio.h>
	FILE *f , *g ;
	#define LIM 30001
	int  v[500001] ;
	long n , k  , pi , ps , poz1 , poz2 , max , min  , minn = -LIM;
	
	void citire();
	void  detmin(long poz1 , long poz2 );
	void detmax(long poz1 , long poz2 );
	void solve();
	void tipar();
	
	int main()
	{
		citire();
		solve();
		tipar();
		return 0;
	}
	
	void citire()
	{
		f=fopen("secventa.in" , "r" );
		fscanf(f , "%ld%ld" , &n,  &k );
		for ( int i = 1 ; i<= n ; ++i )
			fscanf(f , "%d" , &v[i] );
		fclose(f);
	}
	
	
	void solve()
	{
		poz1 = 1;poz2 = k;		
		min = LIM ;
		max = -LIM ;
		detmin(1 , k);
		detmax(1 , k);
		if( min > minn){
			pi = poz1 ; ps = poz2 ; minn = min  ;
		}
		for( int i = k+1 ; i<=n ; ++i)
		{
			if(v[i] >=min && v[i] <= max )
			{
				poz2 = i;
				poz1++;
				if(v[i] != min)
					detmin(poz1 , poz2);
			}
			if(v[i] > max )
			{
				poz2++;
				max = v[i] ;
			}
			if(v[i] < min )
			{
				poz1 = i+1;
				poz2 = i+k;
				detmin(poz1 , poz2);
				detmax(poz1 , poz2 );
				i = i+k ;
			}
			if( min > minn){
			pi = poz1 ; ps = poz2 ; minn = min  ;
			}
		}
	}
	
	void detmin(long poz1 , long poz2 )
	{
		min = LIM;
		for ( int i = poz1 ; i <= poz2 ; ++i )
			if(v[i] < min)
				min = v[i];
	}
	
	void detmax(long poz1 , long poz2 )
	{
		max = -LIM ;
		for ( long i = poz1 ; i<= poz2 ; ++i )
			if( v[i] > max )
				max = v[i] ;
	}
	
	void tipar()
	{
		g=fopen("secventa.out" , "w" );
		fprintf(g ,"%ld %ld %d" , pi , ps , minn );
		fclose(g);
	}