Cod sursa(job #260576)

Utilizator alexeiIacob Radu alexei Data 17 februarie 2009 11:22:36
Problema Cuburi2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#define NMAX 250001

int N,Q;

long long A[NMAX],B[NMAX],S1[NMAX],S2[NMAX];

void reading_init()
{
	scanf("%d%d\n",&N,&Q);

	int i,a1;
	for(i=1; i<=N; ++i)
	{
		scanf("%d",&a1);
		S1[i]=S1[i-1]+a1;
		A[i]=A[i-1]+S1[i-1];
		S2[i]=a1;
	}

	for(i=N; i; --i)
	{
		S2[i]+=S2[i+1];
		B[i]=B[i+1]+S2[i+1];
	}

}

void solve()
{
	int inc,sf,mij,pos,P1,P2;
	long long T1,T2,ANS,sc;
	while( Q-- )
	{
		scanf("%d%d\n",&P1,&P2);

		inc=P1;sf=P2;//pos=P1;
		//sc=S2[P1]-S2[P2+1]-V[P1];

		while( inc<=sf )
		{
			mij=(inc+sf)>>1;
			T1=S1[mij-1]-S1[P1-1];
			T2=S2[mij]-S2[P2+1];
			
			if( T1 < T2 )
			{
				pos=mij;
				inc=mij+1;
			}
			else
				sf=mij-1;
		}

		ANS= A[pos]+B[pos] - A[ P1-1 ] - S1[P1-1]*(pos-P1+1) - B[ P2+1 ] - S2[ P2+1 ]*(P2-pos+1);
	
		printf("%d %lld\n",pos,ANS);

	}
}
int main()
{
	freopen("cuburi2.in","r",stdin);
	freopen("cuburi2.out","w",stdout);
	
	reading_init();

	solve();

	return 0;
}