Cod sursa(job #2607881)

Utilizator victorzarzuZarzu Victor victorzarzu Data 30 aprilie 2020 12:33:29
Problema Cuburi2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cuburi2.in");
ofstream g("cuburi2.out");
int n, m;
long long stanga[250005], dreapta[250005], cstanga[250005], cdreapta[250005];
int poz;
int v[250005];

void Read()
{
  f>>n>>m;
  for(int i = 1;i <= n;++i)
    {
      f>>v[i];
      stanga[i] = stanga[i - 1] + v[i];
      cstanga[i] = stanga[i - 1] + cstanga[i - 1];
    }
  for(int i = n;i >= 1;--i)
  {
    dreapta[i] = dreapta[i + 1] + v[i];
    cdreapta[i] = cdreapta[i + 1] + dreapta[i + 1];
  }
}

int binar(int l, int r)
{
  int poz = l, mid;
  int x = l, y = r;
  while(l <= r)
  {
    mid = (l + r) >> 1;
    if(stanga[mid - 1] - stanga[x - 1] < stanga[y] - stanga[mid - 1])
      l = mid + 1, poz = mid;
    else
      r = mid - 1;
  }
  return poz;
}

void Solve()
{
  int x, y;
  long long cost_st, cost_dr;
  for(int i = 1;i <= m;++i)
    {
      f>>x>>y;
      int poz = binar(x, y);
      long long cost_st, cost_dr;
      cost_st = cstanga[poz] - cstanga[x - 1] - stanga[x - 1] * (poz - x + 1);
      cost_dr = cdreapta[poz] - cdreapta[y + 1] - dreapta[y + 1] * (y - poz + 1);
      g<<poz<<" "<<cost_st + cost_dr<<'\n';
    }
}

int main()
{
  Read();
  Solve();
  return 0;
}