Cod sursa(job #265973)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 24 februarie 2009 19:55:21
Problema Cuburi2 Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;

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

#define NMAX 260000
#define ll long long

struct dir { ll l,r; };

ll A[NMAX], N, M, x, y;
dir Sum[NMAX], Cost[NMAX];

inline int CautBin(int st, int end)
{
	ll m, ok, msum;
	
	msum = (Sum[y].l - Sum[x-1].l) / 2 + Sum[x - 1].l;

	m = (st + end) / 2;
	while (st <= end)
	{
		m = (st + end) / 2;
		if (Sum[m - 1].l < msum && Sum[m].l >= msum)
			end = st - 1;
		else
		{
			if (Sum[m].l < msum) st = m + 1;
			if (Sum[m].l >= msum) end = m - 1;
		}
	}
	return m;
}
int main()
{
	ll i, j, i2, sol, cost;
	fin >>N >>M;
	for (i = 1; i <= N; i++)
		fin >>A[i];

	for (i = 1, j = N; i <= N; i++, j--)            //Calcularea Costurilor / Precalcularea sumelor
	{
		Sum[i].l = Sum[i-1].l + A[i];
		Sum[j].r = Sum[j+1].r + A[j];
		Cost[i].l = Cost[i-1].l + Sum[i-1].l;
		Cost[j].r = Cost[j+1].r + Sum[j+1].r;
	}

	for (i2 = 1; i2 <= M; i2++)
	{
		fin >>x >>y;
		sol = CautBin(x, y);
		cost = (Cost[sol].l - Cost[x].l - (sol-x)*A[x-1]) + (Cost[sol].r - Cost[y].r - (y-sol)*A[y+1]);
		fout <<sol <<' ' <<cost <<'\n';
		
	}
	fout.close();
	return 0;

}