Cod sursa(job #371761)

Utilizator FlorianFlorian Marcu Florian Data 6 decembrie 2009 20:10:27
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
using namespace std;
#include<cstdio>
#define MAX_N 250002
#define ll long long
int N;
ll A[MAX_N], S[MAX_N], SS[MAX_N], Sp[MAX_N], SSp[MAX_N];
int M;
int cbin(int x, int y)
{
	int s = x, st = x, dr = y, m;
	while(st <= dr)
	{
		m = (st+dr)>>1;
		if(S[m-1] - S[x-1] < Sp[m] - Sp[y+1]) s = m, st = m+1;
		else dr = m - 1;
	}
	return s;
}
int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	scanf("%d%d",&N,&M);
	int t,i,x,y;
	ll sol;
	for(i = 1; i <= N; ++i)
	{
		scanf("%d",&A[i]);
		S[i] = S[i-1] + A[i];
		SS[i] = SS[i-1] + S[i];
	}
	for(i = N; i > 0; --i)
	{
		Sp[i] = Sp[i+1] + A[i];
		SSp[i] = SSp[i+1] + Sp[i];
	}
	while(M--)
	{
		scanf("%d%d",&x,&y);
		t = cbin(x,y);
		sol = SS[t - 1] - SS[x-1] - S[x-1] * (t - x) + SSp[t+1] - SSp[y+1] - Sp[y+1]*(y-t);
		printf("%d %lld\n",t, sol);
	}
	return 0;
}