Cod sursa(job #265924)

Utilizator mariusdrgdragus marius mariusdrg Data 24 februarie 2009 19:07:09
Problema Cuburi2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>

const int maxn = 300000;

long long S[maxn],V[maxn],SC[maxn];
int N,M;

long long calc(int st,int dr,int poz)
{
	if (st > dr) return 0;
	return (long long)(SC[dr] - SC[st - 1]) - (long long)poz * (S[dr] - S[st - 1]);
}

long long valoare(int st,int dr,int poz)
{
	return (long long)calc(poz + 1,dr,poz) - calc(st,poz - 1,poz);	
}

int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	scanf("%d %d\n",&N,&M);
	for(int i = 1;i <= N; ++i)
		scanf("%lld ",&V[i]);
	for(int i = 1;i <= N; ++i)
		S[i] = S[i - 1] + V[i];
	
	for(int i = 1;i <= N; ++i)
		SC[i] = SC[i - 1] + V[i] * i;
/*	for(int i = 1;i <= N; ++i)printf("%lld ",S[i]);
	printf("\n");*/
	for(int i = 1;i <= M; ++i)
	{
		int st,dr;
		scanf("%d %d\n",&st,&dr);
		if (st > dr) {int aux = st;st = dr;dr = aux;}
		int x = 0,p = 0;
		for(p = 1;p <= dr - st; p <<= 1);
		for(;p;p >>= 1)
			if (st + x + p <= dr && valoare(st,dr,st + x + p) > valoare(st,dr,st + x + p + 1)) x += p;
        if (valoare(st,dr,st + x) > valoare(st,dr,st + x + 1))++x;
        printf("%d %lld\n",st + x,valoare(st,dr,st + x));
	}
	return 0;
}