Cod sursa(job #271506)

Utilizator BaduBadu Badu Badu Data 5 martie 2009 14:19:57
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<stdio.h>
#define N 250002

long long S[N],ST[N],DR[N],min;

int V[N],n,m,x1,y1,p;

long long Rez(long long x,long long y,long long dir){

	long long r1=0;

	if(dir){if(y) r1 = ST[y] - ST[x-1] - ( y - x + 1 )*S[ x - 1];}

	else if(x<=y1) r1 = DR[x] - DR[y+1] - ( y - x + 1 ) * ( S[n] - S[y] ) ;

	return r1;

}

void Binary_Search(long long st,long long dr){

	int mj;

	while(st<=dr){

		  mj = (st+dr)>>1;

		  if( Rez(x1,mj-1,1)+Rez(mj+1,y1,0) < min ){

			min = Rez(x1,mj-1,1)+Rez(mj+1,y1,0);
			p = mj;

		  }

		  if(Rez(x1,mj-2,1)+Rez(mj,y1,0) <= Rez(x1,mj,1)+Rez(mj+2,y1,0))

			dr = mj - 1;

		  else st = mj + 1;

	}

}


long long main(){

	int i;

	freopen("cuburi2.in","rt",stdin);
	freopen("cuburi2.out","wt",stdout);

	scanf("%d %d",&n,&m);

	for(i=1;i<=n;i++){

		scanf("%d",V+i);

		S[i] = S[i-1] + V[i];

		ST[i] = ST[i-1] + S[i];

	}

	for(i=n;i>=1;i--) DR[i] = DR[i+1] + S[n] - S[i-1];

	for(;m--;){

		scanf("%d %d",&x1,&y1);

                min=1000;

		Binary_Search(x1,y1);

		printf("%d %lld\n",p,min);

	}

	return 0;

}