Cod sursa(job #2026335)

Utilizator giotoPopescu Ioan gioto Data 24 septembrie 2017 12:29:41
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
const int Lmax = 1000000;
int f[Lmax + 5];
long long d[Lmax + 5], cp[Lmax + 5];
int main()
{
    freopen("caramizi.in", "r", stdin);
    freopen("caramizi.out", "w", stdout);
    scanf("%d%d", &n, &m);
    int x, Max = 0;
    for(int i = 1; i <= n ; ++i){
        scanf("%d", &x);
        ++f[x];
        if(x > Max) Max = x;
    }
    long long Sum = 0;
    int k = 0;
    for(int i = 1; i <= Lmax ; ++i){
        Sum = Sum + f[i] * i;
        k += f[i];
        d[i] = max(d[i - 1], Sum - Sum % i + 1LL * (n - k) * i);
    }
    for(int i = Sum / Max; i >= 1 ; --i)
        cp[i] = max(cp[i + 1], Sum - Sum % i);
    for(int i = 1; i <= m ; ++i){
        scanf("%d", &x);
        if(x <= Lmax) printf("%lld\n", d[x]);
        else printf("%lld\n", cp[Sum / x + 1]);
    }
    return 0;
}