Cod sursa(job #696865)

Utilizator PatrikStepan Patrik Patrik Data 28 februarie 2012 20:36:59
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
FILE *f , *g ;
long poz;
long long  s1[250010] , s2[250010] , c1[250010] , c2[250010]  , cost1 , cost2 , n , m , v[250010] , x , y, aux ;

void citire();
void solve();
void caut(long long x ,  long long y);

int main()
{
	citire();
	solve();
	return 0;
}

void citire()
{
	f=fopen("cuburi2.in" , "r" );
	fscanf(f , "%lld%lld" , &n , &m );
	for( long i = 1 ; i<= n ; ++i )
		fscanf(f , "%lld" , &v[i] );
}

void solve()
{
	g=fopen("cuburi2.out"  ,"w" );
	for(long i = 1 ; i<=n ; ++i )
	{
		s1[i] = s1[i-1]+v[i];
		c1[i] = c1[i-1]+s1[i-1];
	}
	for(long i = n ; i ; --i )
	{
		s2[i] = s2[i+1]+v[i];
		c2[i] = s2[i+1]+c2[i+1];
	}
	for(long i = 1 ; i<= m; ++i )
	{
		fscanf(f , "%lld%lld" , &x , &y );
		if(x >y )
		{aux = x; x = y ; y = aux;}
		caut(x,y);
		cost1 = c1[poz] - c1[x]-(poz-x)*s1[x-1];
		cost2 = c2[poz] - c2[y]-(y-poz)*s2[y+1];
		fprintf(g , "%ld %lld\n" ,poz, cost1+cost2);
	}
	fclose(f);
	fclose(g);
}

void caut( long long  x ,long  long y)
{
	long long ls , ld , mid ;
	ls = x ; ld = y;
	while(ls <= ld )
	{
		mid = (ls+ld)/2;
		if(s1[mid-1]-s1[x-1] < s1[y]-s1[mid-1])
		{
			ls = mid+1;
			poz = mid;
		}
		else
			ld = mid-1;
	}
}