Cod sursa(job #254555)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 7 februarie 2009 12:57:16
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.67 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

using namespace std;

const int maxN = 250001;
const long long oo = 1LL << 60;

long long Sum[maxN], Sum2[maxN], InvSum[maxN], InvSum2[maxN];
int V[maxN], N, M;

inline long long min(long long a, long long b){
	if (a < b)
		return a;
	return b;
}

long long SumaStg(int x, int y){
	return (Sum2[y] - Sum2[x - 1]) - 1LL * (y - x + 1) * Sum[x - 1];
}
long long SumaDr(int x, int y){
	return (InvSum2[x] - InvSum2[y + 1]) - 1LL * (y - x + 1) * InvSum[y + 1];
}

inline long long SumaPe(int a, int b, int i){
	int nr;
	long long st, dr;
	if (i == a)
		return SumaDr(a + 1, b);
	if (i == b)
		return SumaStg(a, b - 1);
	st = SumaStg(a, i - 1);
	dr = SumaDr(i + 1, b);
	//printf("(%d %d %d %lld %lld)\n",a, b, i, st, dr);
	return st + dr;
}
void baga_brut(int a, int b){
	int i, nr, poz;
	long long st, dr, minim = oo, x;

	nr = b - a;

	for (i = a ; i <= b; ++i){
		x = SumaPe(a, b, i);
		if (x < minim){
			minim = x;
			poz = i;
		}
	}
	printf("%d %lld\n", poz ,minim);
}

void baga_marfa(int a, int b){
}
int main(){
	int i, a, b;

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

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++i){
		scanf("%d", &V[i]);
		Sum[i] = Sum[i - 1] + V[i];
		Sum2[i] = Sum2[i - 1] + Sum[i];
	}
	for (i = N; i; --i){
		InvSum[i] = InvSum[i + 1] + V[i];
		InvSum2[i] = InvSum2[i + 1] + InvSum[i];
	}
	while (M --){
		scanf("%d%d", &a, &b);
		if (M <= 5000)
			baga_brut(a, b);
		else
			baga_marfa(a, b);
	}

	/*for (i = 1; i <= N; ++i)
		printf("%d ", InvSum[i]);
	puts("");

	for (i = 1; i <= N; ++i)
		printf("%d ", InvSum2[i]);
	puts("");*/
	//fprintf(stderr, "%lld %lld ", SumaStg(1,2), SumaDr(4,5));
}