Cod sursa(job #254474)

Utilizator mariusdrgdragus marius mariusdrg Data 7 februarie 2009 12:20:43
Problema Cuburi2 Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 0.95 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 <= M; ++i)
	{
		int st,dr;
		scanf("%d %d\n",&st,&dr);
		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;
                ++x;
                printf("%d %lld\n",st + x,valoare(st,dr,st + x));
	}
	return 0;
}