Cod sursa(job #963981)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 19 iunie 2013 20:20:37
Problema Cuburi2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>

#define maxdim 250005

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

int n,q;
int A[maxdim];
long long bring_left[maxdim],sum_left[maxdim],bring_right[maxdim],sum_right[maxdim];

inline long long compute ( int a , int b , int c ){
	
	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 ){
	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) <= compute(x,middle+1,y) ){
			right = middle-1;
			loc = middle;
		}
		else{
			left = middle+1;
		}
	}
	
	fprintf(g,"%d %lld\n",loc,compute(x,loc,y));
}

int main () {
	
	fscanf(f,"%d %d",&n,&q);
	for ( int i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d",&A[i]);
	}
	
	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);
		solve(x,y);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}