Cod sursa(job #253898)

Utilizator DjSefuWrong name DjSefu Data 6 februarie 2009 13:27:01
Problema Caramizi Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.99 kb
using namespace std;
#include<stdio.h>
#include<algorithm>
FILE *f=fopen("caramizi.in","r"),
     *g=fopen("caramizi.out","w");
#define N_MAX 200009
long long min(long long a,long long b,long long c)
{ if(a<b&&a<c) return a;
  if(b<a&&b<c) return b;
  return c;
}
long long min(long long a,long long b)
{ if(a>b) return b;
  return a;
}
long long max(long long a,long long b)
{ if(a>b) return a;
  return b;
}
long long sums[N_MAX],a[N_MAX],things[N_MAX],i,j,n,m,k,v,x,u;
int bs(int val)
{
    int i, step;
    for (step = 1; step < n; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step <=n && things[i + step] >= val)
           i += step;
    return i;
}
char sir[10005];
int p=0,nr;
void cit(long long &y)
{ y=0;
  while(sir[p]>='0'&&sir[p]<='9') { y=(y<<3)+(y<<1)+sir[p]-'0';++p;
                                    if(p==10001) fread(sir,1,10000,f);
                                    }
  while(sir[p]<'0'||sir[p]>'9') { ++p;
                                  if(p==10000) fread(sir,1,10000,f);
                                  }  
}  
int main()
{ fread(sir,1,10000,f);
  while(sir[p]<'0'||sir[p]>'9') { ++p;
                                  if(p==10000) fread(sir,1,10000,f);
                                  }  
  cit(n);
  cit(m);
  for(i=1;i<=n;++i) cit(a[i]);
  sort(a+1,a+n+1);
  for(i=1;i<=n;++i) sums[i]=sums[i-1]+a[i];
  things[n]=a[1];
  if(n>1) if(n>2)things[n-1]=min(a[1]+a[2],a[3],sums[n]/(n-1));
          else things[n-1]=sums[n];

  for(i=n-2;i>=1;--i) { things[i]=min(sums[n-i+1],sums[max(2*(n-i)+1,n)]-sums[n-i+1],sums[n]/i);
                        if(things[i]<things[i+1]) things[i]=2000000007;
                        }  
  for(i=1;i<=m;++i) { cit(x);
                      k=bs(x);
                      if(k==n) fprintf(g,"%lld\n",x*n);
                      else fprintf(g,"%lld\n",u=min(sums[n],max(things[k+1]*(k+1),x*k)));
                      }
  fclose(f);
  fclose(g);
  return 0;
}