Cod sursa(job #260570)

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

int N,Q;

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

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

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

	for(i=N; i; --i)
	{
		S2[i]=S2[i+1]+V[i];
		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]-S1[P1-1]-V[mij];
			T2=S2[mij]-S2[P2+1]-V[mij];
			
			if( T1+T2 < sc )
			{
				pos=mij;sc=T1+T2;
			}
			if( T1<T2 )
				inc=mij+1;
			else
				sf=mij-1;
		}

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

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

	solve();

	return 0;
}