Cod sursa(job #261083)

Utilizator alexeiIacob Radu alexei Data 17 februarie 2009 21:03:33
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#define NMAX 250001

long long A[NMAX],B[NMAX],S1[NMAX],S2[NMAX];
char s[NMAX*7];

int Q;

void reading_init()
{
    int N;
	scanf("%d %d\n",&N,&Q);
	
	gets( s );//, sizeof( s ), stdin );
	
	int p,i=1,a1;

	for(p=0,a1=0; s[p]!=NULL; ++p)
	{
		if( s[p]==' ' )
		{
			S1[i]=S1[i-1]+a1;
			A[i]=A[i-1]+S1[i-1];
			S2[i]=a1;
			++i;
			a1=0;
		}
		else
		{
			a1*=10;
			a1+=s[p]-'0';
		}

	}

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

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

}

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

		inc=P1;sf=P2;

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

		printf("%d %lld\n",pos,T1+T2);

	}
}
int main()
{
	freopen("cuburi2.in","rt",stdin);
	freopen("cuburi2.out","wt",stdout);
	
	reading_init();
	solve();

	return 0;
}