Cod sursa(job #1558598)

Utilizator borcanirobertBorcani Robert borcanirobert Data 29 decembrie 2015 13:37:02
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");

const int MAX = 250010;
const long long INF = 9999999999999999;
long long H[MAX];
long long l[MAX], r[MAX];
long long ns[MAX], nd[MAX];
long long N, M;
long long x, y;
long long p;

void BinarySearch( int x, int y );

int main()
{
	int i;
	
	fin >> N >> M;
	for ( i = 1; i <= N; i++ )
		fin >> H[i];
	
	l[1] = 0;
	for ( i = 2; i <= N; i++ )
	{
		p += H[i - 1];
		l[i] = l[i - 1] + p;
		ns[i] = p;
	}
	
	r[N] = 0; p = 0;
	for ( i = N - 1; i >= 1; i-- )
	{
		p += H[i + 1];
		r[i] = r[i + 1] + p;
		nd[i] = p;
	}
	
	/*for ( i = 1; i <= N; i++ )
		fout << l[i] << ' ';
	fout << '\n';
	for ( i = 1; i <= N; i++ )
		fout << r[i] << ' ';
	fout << '\n';	*/
	
	for ( i = 1; i <= M; i++ )
	{
		fin >> x >> y;
		BinarySearch(x, y);
	}
	
	fin.close();
	fout.close();
	return 0;
}

void BinarySearch( int x, int y )
{
	long long sl = ns[x], sr = nd[y];
	long long i1 = x, i2 = y;
	long long st = x, dr = y, mid, poz = x;
	long long s1, s2 = INF;
	
/*	for ( poz = x; poz <= y; poz++ )
	{
		s1 = l[poz] - ( sl * ( poz - i1 ) + l[x] ) + r[poz] - ( sr * ( i2 - poz ) + r[y] );
		if ( s1 < s2 )
			s2 = s1, mid = poz;
	}
	
	fout << mid << ' ' << s2 << '\n';	*/
	
	while ( st <= dr )
	{
		mid = ( st + dr ) / 2;
		
		if ( l[mid] - ( sl * ( mid - i1 ) + l[x] ) < r[mid] - ( sr * ( i2 - mid ) + r[y] ) )
		{
			st = mid + 1;
			poz = mid;
		}
		else
			dr = mid - 1;
	}
	
	s1 = l[poz] - ( sl * ( poz - i1 ) + l[x] ) + r[poz] - ( sr * ( i2 - poz ) + r[y] );
	if ( poz != y )
		s2 = l[poz + 1] - ( sl * ( (poz + 1) - i1 ) + l[x] ) + r[poz + 1] - ( sr * ( i2 - (poz + 1) ) + r[y] );
	else
		s2 = INF;
	
	if ( s1 < s2 )
	{
		fout << poz << ' ' << s1 << '\n';
	}
	else
	{
		fout << poz + 1 << ' ' << s2 << '\n';
	}
}