Cod sursa(job #264263)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 21 februarie 2009 20:41:41
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <stdio.h>
#define N 250005
int n,m,i,x,y,low,mid,high,p,a[N];
long long c1,c2,s1[N],s2[N],ss1[N],ss2[N];

int main(){
  freopen("cuburi2.in","r",stdin);freopen("cuburi2.out","w",stdout);
  scanf("%d %d",&n,&m);
  for (i=1;i<=n;++i)scanf("%d ",&a[i]);
  //preproc
  for (i=1;i<=n;++i){s1[i]=s1[i-1]+a[i];ss1[i]=ss1[i-1]+s1[i];}
  for (i=n;i>0 ;--i){s2[i]=s2[i+1]+a[i];ss2[i]=ss2[i+1]+s2[i];}
  ////
  for (;m;--m){
    scanf("%d %d",&x,&y);
    low=x;high=y;
    while (low<high){
      mid=(low+high)/2;
      if (s1[mid-1]-s1[x-1] < s2[mid+1]-s2[y+1]){p=mid+1; low=mid+1;}
      else {p=mid-1;high=mid-1;}
    }
    c1=ss1[p-1]-ss1[x-1]-s1[x-1]*(p-x);
    c2=ss2[p+1]-ss2[y+1]-s2[y+1]*(y-p);
    printf("%d %lld\n",p,c1+c2);
  }
return 0;
}