Cod sursa(job #254714)

Utilizator ProtomanAndrei Purice Protoman Data 7 februarie 2009 13:50:58
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.3 kb
// using hibride:)
#include <algorithm>
#include <stdio.h>

#define ll long long
#define MAX 250010

using namespace std;

int n, m;
int vctNr[MAX];
ll sumaDistSpate[MAX], sumaDistFata[MAX];
ll nrCuburiSpate[MAX], nrCuburiFata[MAX];

int main()
{
	freopen("cuburi2.in", "r", stdin);
	freopen("cuburi2.out", "w", stdout);

	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &vctNr[i]);

	if (n <= 5000 && m <= 5000)
	{
		for (; m; m--)
		{
			ll sumaMinGs = 1;
			for (int i = 1; i <= 62; i++)
				sumaMinGs *= 2;
			int start, finish, loc;
			scanf("%d %d", &start, &finish);

			// din spate
			ll nrCuburi = 0;
			for (int i = finish; i >= start; i--)
			{
				sumaDistSpate[i] = sumaDistSpate[i + 1] + nrCuburi;
				nrCuburi += vctNr[i];
			}

			// din fata
			nrCuburi = 0;
			for (int i = start; i <= finish; i++)
			{
				sumaDistFata[i] = sumaDistFata[i - 1] + nrCuburi;
				nrCuburi += vctNr[i];
			}

			for (int i = start; i <= finish; i++)
			{
				if (sumaDistFata[i] + sumaDistSpate[i] <= sumaMinGs)
				{
					loc = i;
					sumaMinGs = sumaDistFata[i] + sumaDistSpate[i];
				}
				sumaDistFata[i] = sumaDistSpate[i] = 0;
			}

			printf("%d %lld \n", loc, sumaMinGs);
		}
	}
	else
	{
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}