Cod sursa(job #696847)

Utilizator PatrikStepan Patrik Patrik Data 28 februarie 2012 20:25:43
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
	#include<stdio.h>
	FILE *f , *g ;
	long long  s1[250010] , s2[250010] , c1[250010] , c2[250010]  , cost1 , cost2 , n , m , v[250010] , x , y, aux , poz ;
	
	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 , "%lld " ,poz);
			fprintf(g , "%lld\n" , 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])
				ld = mid-1;
			else
			{
			ls = mid+1;
			poz = mid;
			}
		}
	}