Cod sursa(job #969755)

Utilizator bugyBogdan Vlad bugy Data 5 iulie 2013 12:25:11
Problema Secventa Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <stdio.h>
#include <deque>
#define dim 500005
using namespace std;

int main()
{
	deque< pair<int,int> > mydeque;
	deque< pair<int,int> >::iterator it;
	pair <int,int> *P,PP;
	
	int i,x,min,in,sf,N,K;
	
	FILE *f=fopen("secventa.in","r"), *g=fopen("secventa.out","w");

	fscanf(f,"%d %d",&N,&K);
	
	for(i = 1; i <= K; i++)
	{
		fscanf(f,"%d",&x);
		if(x < min)
		{
			min = x;
		}
		
		P = new pair<int, int> [0];
		P[0] = make_pair(x,i);    
		
		if(mydeque.size() == 0)
			mydeque.push_back(P[0]);
		else
		{
			if(mydeque.front().first > P[0].first )
				mydeque.push_front(P[0]);
			else if(mydeque.back().first < P[0].first)
				mydeque.push_back(P[0]);
			else
			{
				it = mydeque.begin();
				while (it != mydeque.end())
				{	
					PP = *it;
					if(PP.first > P[0].first)
					{
						mydeque.insert (it,P[0]);  
						break; 
					}
					else it++;		
				}
			}
		}
	}
	in = 1;
	sf = K;
		
	for(i = K + 1; i <= N; i++)
	{
		fscanf(f,"%d",&x);
		P = new pair<int, int> [0];
		P[0] = make_pair(x,i);    
		//stergem elementele de la coada mai mari decat x 
		it = mydeque.end()-1;
		do
		{	
			PP = *it;
			if(PP.first > x)
			{
				mydeque.erase(it);  
				if(it != mydeque.begin())
					it--;
			}
			else break;		
		}while (it != mydeque.begin());
		//stergem elementele de la cap cu indicele mai mic decat a lui x
		it = mydeque.begin();
		
		while (it != mydeque.end())
		{	
			PP = *it;
			if(PP.second < i- K + 1 )
			{
				mydeque.erase(it);
				it = mydeque.begin();			
			}
			else break;					
		}
		mydeque.push_back(P[0]);
		//daca minimul din capul cozii este mai mare decat min, actualizam.
		if( mydeque.front().first > min)
		{
			min = mydeque.front().first;
			sf = i;
			in = i - K + 1;		
		}	
	}
	
	fprintf(g,"%d %d %d\n",in,sf,min);
fclose(f);
fclose(g);
return 0;
}