Cod sursa(job #253704)

Utilizator DjSefuWrong name DjSefu Data 6 februarie 2009 11:33:55
Problema Caramizi Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.41 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;
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;
}
int main()
{ fscanf(f,"%lld %lld",&n,&m);
  for(i=1;i<=n;++i) fscanf(f,"%lld",&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];
  things[n-1]=min(a[1]+a[2],a[3],sums[n]/(n-1));

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