Cod sursa(job #2022747)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 17 septembrie 2017 10:07:54
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

const int LIM = 250001;

long long CM[LIM];
long long sp[LIM], cst[LIM], cdr[LIM];
int v[LIM];

int aprox(double x){
  int rez = x;
  x = x - rez;
  if(x >= 0.5 )
    rez++;
  return rez;
}

int main()
{
    FILE *fi = fopen("cuburi2.in", "r"), *fo = fopen("cuburi2.out", "w");
    int n, m, poz, x, y, i;
    double poz_brut;
    fscanf(fi, "%d%d", &n, &m);
    long long cost;
    for(i = 1; i <= n; i++){
      fscanf(fi, "%d", &v[i]);
      sp[i] = sp[i - 1] + v[i];
      cst[i] = cst[i - 1] + v[i] * (i - 1);
      CM[i] = CM[i - 1] + v[i] * i;
    }
    for(i = n - 1; i >= 1; i--)
      cdr[i] = cdr[i + 1] + v[i] * (n - i);
    for(m = m; m > 0; m--){
      fscanf(fi, "%d%d", &x, &y);
      poz_brut = (double) (CM[y] - CM[x - 1]) / (sp[y] - sp[x - 1]);
      poz = aprox(poz_brut);
      cost = cst[y] - cst[poz] - (sp[y] - sp[poz]) * (poz - 1) + cdr[x] - cdr[poz] - (sp[poz - 1] - sp[x - 1]) * (n - poz);
      fprintf(fo, "%d %lld\n", poz, cost);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}