Pagini recente » Cod sursa (job #861864) | Cod sursa (job #1749417) | Cod sursa (job #2235708) | Cod sursa (job #1369972) | Cod sursa (job #963979)
Cod sursa(job #963979)
#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) ){
left = middle+1;
loc = middle+1;
}
else{
right = 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;
}