Cod sursa(job #964059)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 19 iunie 2013 23:46:35
Problema Cuburi2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<stdio.h>

#define maxdim 250005
#define file_size 1000000

FILE*f=fopen("cuburi2.in","r");
FILE*g=fopen("cuburi2.out","w");

int n,q,ch;
int A[maxdim];
char buff[file_size+5];

inline long long compute ( int a , int b , int c , long long *bring_left , long long *bring_right , long long *sum_left , long long *sum_right ){
	
	return bring_left[b] - bring_left[a] - sum_left[a-1]*(b-a) + bring_right[b] - bring_right[c] - sum_right[c+1]*(c-b);
}

inline void solve ( const int &x , const int &y , long long *bring_left , long long *bring_right , long long *sum_left , long long *sum_right ){
	int loc = 0;
	
	int left = x,middle,right = y;
	while ( left <= right ){
		middle = (left+right)>>1;
		if ( middle == y ){
			loc = y;
			break ;
		}
		
		if ( compute(x,middle,y,bring_left,bring_right,sum_left,sum_right) <= compute(x,middle+1,y,bring_left,bring_right,sum_left,sum_right) ){
			right = middle-1;
			loc = middle;
		}
		else{
			left = middle+1;
		}
	}
	
	fprintf(g,"%d %lld\n",loc,compute(x,loc,y,bring_left,bring_right,sum_left,sum_right));
}

inline int next () {
	int r = 0;
	
	while ( !(buff[ch] >= '0' && buff[ch] <= '9') ){
		++ch;
		if ( ch == file_size ){
			fread(buff,file_size,1,f);
			ch = 0;
		}
	}
	
	while ( buff[ch] >= '0' && buff[ch] <= '9' ){
		r = r * 10 + buff[ch]-'0';
		++ch;
		if ( ch == file_size ){
			fread(buff,file_size,1,f);
			ch = 0;
		}
	}
	
	++ch;
	if ( ch == file_size ){
		fread(buff,file_size,1,f);
		ch = 0;
	}
	
	return r;
}

int main () {
	
	fread(buff,file_size,1,f);
	n = next(); q = next();
	//fscanf(f,"%d %d",&n,&q);
	for ( int i = 1 ; i <= n ; ++i ){
		//fscanf(f,"%d",&A[i]);
		A[i] = next();
	}
	
	long long bring_left[maxdim],sum_left[maxdim],bring_right[maxdim],sum_right[maxdim];
	bring_left[0] = bring_right[n+1] = sum_left[0] = sum_right[n+1] = 0;
	
	for ( int i = 1 ; i <= n ; ++i ){
		bring_left[i] = bring_left[i-1] + sum_left[i-1];
		sum_left[i] = sum_left[i-1] + A[i];
	}
	for ( int i = n ; i >= 1 ; --i ){
		bring_right[i] = bring_right[i+1] + sum_right[i+1];
		sum_right[i] = sum_right[i+1] + A[i];
	}
	
	int x,y;
	for ( int i = 1 ; i <= q ; ++i ){
		//fscanf(f,"%d %d",&x,&y);
		x = next(); y = next();
		solve(x,y,bring_left,bring_right,sum_left,sum_right);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}