Cod sursa(job #696794)

Utilizator PatrikStepan Patrik Patrik Data 28 februarie 2012 20:07:45
Problema Cuburi2 Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
	#include<stdio.h>
	FILE *f , *g ;
	long long n , m , v[250002] , x , y  , aux , poz  ;
	long long  s1[250002] , s2[250002] , c1[250002] , c2[250002]  , cost1 , cost2;
	
	void citire();
	void solve();
	void caut(long x , long y);
	
	int main()
	{
		citire();
		solve();
		return 0;
	}
	
	void citire()
	{
		f=fopen("cuburi2.in" , "r" );
		fscanf(f , "%ld%ld" , &n , &m );
		for( long i = 1 ; i<= n ; ++i )
			fscanf(f , "%ld" , &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 , "%ld%ld" , &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 x , 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])
				ld = mid-1;
			else
			{
				ls = mid+1;
			poz = mid;
			}
		}
	}