Cod sursa(job #253822)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 6 februarie 2009 12:41:05
Problema Caramizi Scor 35
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.18 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("caramizi.in");
ofstream fout("caramizi.out");
#define NMAX 200010
#define LMAX 1000000
long long A[NMAX],B[NMAX],D[NMAX],N,M;
long long C[LMAX];

int cauta(long long c);

int main()
{
        fin>>N>>M;
        long long i,pos,x;

        for (i=1;i<=N;i++)
                fin>>A[i];
        for (i=1;i<=N;i++)
                fin>>D[i];
        sort(A+1,A+N+1);
        B[0]=0;
        for (i=1;i<=N;i++)
                B[i]=B[i-1]+A[i];
        C[1]=N;
        for (i=1;i<=LMAX;i++)
        {
                if (i<=A[1]) pos=0;
                else
                if (i>=A[N]) pos=N;
                else
                pos=cauta(i);
                C[i]=B[pos]-B[pos]%i+(N-pos)*i;
                if (C[i-1]>C[i]) C[i]=C[i-1];
        }
        for (i=1;i<=M;i++)
                fout<<C[D[i]]<<'\n';
        fout.close();
        return 0;
}

int cauta(long long c)
{
        int st,sf,m;
        st=1;
        sf=N;
        m=(st+sf)/2;
        while (A[m]>c||A[m+1]<=c)
        {
                if (A[m]>c) sf=m-1;
                if (A[m+1]<=c) st=m+1;
                m=(st+sf)/2;
        }
        return m;
        
}