Cod sursa(job #2021451)

Utilizator hrazvanHarsan Razvan hrazvan Data 13 septembrie 2017 18:40:47
Problema Caramizi Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#define MAXC 1000000
#define MAXN 200000
int v[MAXN + 1];
long long s[MAXN], d[MAXC + 1], u[MAXN + 1];

inline long long max2(long long a, long long b){
  return a < b ? b : a;
}

int main(){
  FILE *in = fopen("caramizi.in", "r");
  int n, m, i, p;
  fscanf(in, "%d%d", &n, &m);
  for(i = 0; i < n; i++){
    fscanf(in, "%d", &v[i]);
    s[i] = v[i];
    if(i != 0)
      s[i] += s[i - 1];
  }
  p = 0;
  i = 1;
  v[n] = MAXC;
  while(i <= v[n]){
    if(i == v[p])
      p++;
    d[i] = max2(d[i - 1], 1LL * (n - p + s[p - 1] / i) * i);
    i++;
  }
  for(p = s[n - 1] / v[n - 1]; p > 0; p--){
     u[p] = max2(u[p + 1], s[n - 1] / p * p);
  }
  u[0] = u[1];
  FILE *out = fopen("caramizi.out", "w");
  long long l, x;
  for(i = 0; i < m; i++){
    fscanf(in, "%lld", &l);
    if(l <= v[n])
      fprintf(out, "%lld\n", d[l]);
    else{
      x = s[n - 1] / l;
      fprintf(out, "%d\n", u[x + 1]);
    }
  }
  fclose(in);
  fclose(out);
  return 0;
}