Cod sursa(job #2989905)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 7 martie 2023 11:18:58
Problema Cuburi2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");

const int kN = 2e5 + 5e4;
int a[1 + kN];
int64_t sum[1 + kN], coefSum[1 + kN];

int64_t getCost(int l, int r) {
  if (r < l) {
    return 0;
  }

  return coefSum[r] - coefSum[l - 1] - (sum[r] - sum[l - 1]) * (l - 1);
}

int64_t getRevCost(int l, int r) {
  if (r < l) {
    return 0;
  }

  return (sum[r] - sum[l - 1]) * (r + 1) - (coefSum[r] - coefSum[l - 1]);
}

int main() {
  int n, q;
  fin >> n >> q;

  for (int i = 1; i <= n; ++i) {
    fin >> a[i];

    sum[i] = sum[i - 1] + a[i];
    coefSum[i] = coefSum[i - 1] + (int64_t)i * a[i];
  }

  for (int i = 0; i < q; ++i) {
    int st, dr;
    fin >> st >> dr;

    int l = st, r = dr, pos = st - 1;

    while (l <= r) {
      int mid = (l + r) / 2;

      if (sum[mid] - sum[st - 1] < sum[dr] - sum[mid]) {
        pos = mid;
        l = mid + 1;
      } else {
        r = mid - 1;
      }
    }

    pos += 1;

    fout << pos << ' ' << getRevCost(st, pos - 1) + getCost(pos + 1, dr) << '\n';
  }

  fin.close();
  fout.close();

  return 0;
}