Cod sursa(job #284940)

Utilizator DraStiKDragos Oprica DraStiK Data 22 martie 2009 08:45:42
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <algorithm>
#define INF 1000005
#define DIM 200005
#define ll long long
using namespace std;
ll v[INF],h[INF];
ll sum=-1;
int c[DIM];
int n,m;
void read ()
{
    int i;
    scanf ("%d%d",&n,&m);
    for (i=1; i<=n; ++i)
        scanf ("%d",&c[i]);
    c[0]=1;
    c[n+1]=INF;
}
ll max (ll a,ll b)
{
    if (a>b)
        return a;
    return b;
}
void solve ()
{
    ll i,j;
    for (i=0; i<=n; ++i)
    {
        sum+=c[i];
        for (j=c[i]; j<c[i+1]; ++j)
        {
            v[j]=sum-sum%j+(n-i)*j;
            if (v[j-1]>v[j])
                v[j]=v[j-1];
        }
    }
    for (i=sum/c[n]; i; --i)
        h[i]=max (sum-sum%i,h[i+1]);
}
void query ()
{
    int i,x;
    for (i=1; i<=m; ++i)
    {
        scanf ("%d",&x);
        if (x<INF)
            printf ("%lld\n",v[x]);
        else
            printf ("%lld\n",h[sum/x+1]);
    }
}
int main ()
{
    freopen ("caramizi.in","r",stdin);
    freopen ("caramizi.out","w",stdout);
    read ();
    sort (c+1,c+n+1);
    solve ();
    query ();
    return 0;
}