Cod sursa(job #254294)

Utilizator tvladTataranu Vlad tvlad Data 7 februarie 2009 10:49:31
Problema Cuburi2 Scor 32
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.01 kb
#include <cstdio>

const int N = 250001;
const int M = 250001;
const int INF = 0x3f3f3f3f;

int n,m, x,y;
int a[N];
long long s[N], ss[N];

void precalc() {
	s[0] = 0;
	ss[0] = 0;
	for (int i = 1; i <= n; ++i) {
		s[i] = s[i-1] + a[i];
		ss[i] = ss[i-1] + s[i];
	}
}

long long dreapta ( int x, int y ) {
	return s[y]*(y-x+1) - ss[y-1] + ((x > 1) ? ss[x-2] : 0);
}

void solve ( int x, int y ) {
	if (x == y) {
		printf("%d 0\n",x);
		return;
	}
	long long min, curd = dreapta(x+1,y), curs = 0;
	int pmin;
	min = curd;
	pmin = x;
	for (int i = x+1; i <= y; ++i) {
		curd -= s[y] - s[i-1];
		curs += s[i-1] - s[x-1];
		if (min > curd+curs) {
			min = curd+curs;
			pmin = i;
		}
	}
	printf("%d %d\n",pmin,min);
}

int main() {
	freopen("cuburi2.in","rt",stdin);
	freopen("cuburi2.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 1; i <= n; ++i) {
		scanf("%d",&a[i]);
	}
	precalc();
	for (int i = 0; i < m; ++i) {
		scanf("%d %d",&x,&y);
		solve(x,y);
	}
	return 0;
}