Cod sursa(job #547476)

Utilizator rares192Preda Rares Mihai rares192 Data 6 martie 2011 13:16:01
Problema Secventa 2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<deque>
#include<algorithm>
using namespace std;

void read();
void solve();

deque<int > minQ, maxQ;
long long a[50005];
int n, k;
long long maxim = -1000000000000000000LL;
int inc, sf;

int main()
{
	read();
	solve();
	return 0;
}

void read()
{
	ifstream fin("secv2.in");
	fin >> n >> k;
	
	int nr;
	for(int i = 1; i <= n; ++i)
	{
		fin >> nr;
		a[i] = a[i-1] + nr;
	}
	
	fin.close();
}

void solve()
{
	ofstream fout("secv2.out");
	
	for(int i = 1; i <= n; ++i)
	{
		while( !minQ.empty() && a[i] <= a[ minQ.back() ] )
			minQ.pop_back();
		
		minQ.push_back(i);
		
		while( !maxQ.empty() && a[i] >= a[ maxQ.back() ] )
			maxQ.pop_back();
		
		maxQ.push_back(i);
		
			while( !maxQ.empty() && maxQ.front() <= minQ.front() )
			if( maxQ.size() == 1)
				maxQ.clear();
			else
			maxQ.pop_front();
			
		if( i >= k && !maxQ.empty() && a[ maxQ.front() ] - a[minQ.front() ] > maxim )
		{
			inc = min( maxQ.front(), minQ.front() );
			sf = max( maxQ.front(), minQ.front() );
			maxim = a[ maxQ.front() ] - a[minQ.front() ];
		}
		
	}
	
	if( maxim == -1000000000000000000LL )
	{
		fout << 1 << " " << n << " ";
		fout << a[n] - a[0];
	}
	else
	fout << inc+1 <<" "<<sf <<" "<< maxim;
	fout.close();
}