Cod sursa(job #254681)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 7 februarie 2009 13:43:09
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.8 kb
#include<stdio.h>
FILE*fin=fopen("cuburi2.in","r");
FILE*fout=fopen("cuburi2.out","w");
#define nm 250005
#define ceva 30000000
#define ll long long
int n,m,h[nm],turn,st,dr;
ll sum[nm],c[nm],d[nm],nll=0,ans;
ll rs(ll s,ll r)
{
  return sum[r]-sum[s-1];
}
ll f(int k)
{
  ll ansc;
  ansc=c[k-1]-rs(1,st-1)*(k-st)-c[st-1];
  ansc+=d[k+1]-rs(dr+1,n)*(dr-k)-d[dr+1];
  return ansc;
}
ll ts(int left,int right)
{
  int j,leftThird,rightThird;  
  ll ansc,ansr=nll;      
  if(right-left<=2)
  {
    for(j=left;j<=right;j++)
    {
      ansc=c[j-1]-rs(1,st-1)*(j-st)-c[st-1];
	  ansc+=d[j+1]-rs(dr+1,n)*(dr-j)-d[dr+1];
	  if(ansc<ansr)
	  {
	    ansr=ansc;
	    turn=j;
	  }
    }
    return ansr;
  }
  else
  {
    leftThird = (left*2+right)/3;
    rightThird = (left+right*2)/3;
    if(f(leftThird)>f(rightThird)) return ts(leftThird,right);
    else return ts(left,rightThird);
  }    
}
int main()
{
  int i,j;
  ll ansc;
  long nl=2000000000;
  for(i=1;i<=20000;i++)
    nll+=nl;
  fscanf(fin,"%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin,"%d",&h[i]);
  sum[0]=0;
  for(i=1;i<=n;i++)
    sum[i]=sum[i-1]+h[i];
  c[0]=0;
  for(i=1;i<n;i++)
    c[i]=c[i-1]+sum[i];
  d[n+1]=0;
  for(i=n;i>1;i--)
    d[i]=d[i+1]+sum[n]-sum[i-1];
  if((ll)n*m<=ceva)
  {
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d%d",&st,&dr);
      ans=nll;
      for(j=st;j<=dr;j++)
      {
	ansc=c[j-1]-rs(1,st-1)*(j-st)-c[st-1];
	ansc+=d[j+1]-rs(dr+1,n)*(dr-j)-d[dr+1];
	if(ansc<ans)
	{
	  ans=ansc;
	  turn=j;
	}
      }
      fprintf(fout,"%d %lld\n",turn,ans);
    }
  }
  else
  {
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d%d",&st,&dr);
      ans=ts(st,dr);
      fprintf(fout,"%d %lld\n",turn,ans);
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}