Cod sursa(job #266159)

Utilizator savimSerban Andrei Stan savim Data 24 februarie 2009 22:38:14
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <algorithm>

#define maxn 1000010

using namespace std;

long long n, i, j, k, m, t, ma, x;
long long d[maxn], sol[maxn], q, poz, sol2[maxn], h, rez;


int main()
{
    freopen("caramizi.in", "r", stdin);
    freopen("caramizi.out", "w", stdout);
    scanf("%lld%lld", &n, &m);
    for(i=1; i<=n; i++)
    {
        scanf("%lld", &d[i]);
    }
   
    sort(d+1, d+n+1);
    
    t=-1;
    d[0]=1;
    d[n+1]=maxn;
    poz=1;
    for(i=0; i<=n; i++)
    {
        t+=d[i];
        for(j=d[i]; j<d[i+1]; j++)
        {
            x = t-t%j+(n-i)*j;
            if(x>ma)
            {
                ma=x;
            }
            sol[j]=ma;
        }
    }
    
    for(i=t/d[n]; i; i--)
    {
        sol2[i]=sol2[i+1];
        if(t - t%i>sol2[i]) sol2[i]=t-t%i;
    }
        
    for(i=1; i<=m; i++)
    {

        scanf("%lld", &q);

        if(q<=maxn)printf("%lld\n", sol[q]);
        else
        {
            h=t/q;
            rez=sol[d[n]];
            if(t > (long long)(h+1) * d[n]) rez=sol2[h+1];
            printf("%lld\n", rez);
        }
    }
    return 0;
}