Cod sursa(job #2253745)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 4 octombrie 2018 12:39:09
Problema Cuburi2 Scor 55
Compilator cpp Status done
Runda shimulare_fara_shim Marime 1.31 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");
#define int long long
const int maxn = 250005;
int distdr[maxn];
int dist[maxn];
int sp[maxn];
int v[maxn];
int n;

void solve()
{
    int x, y;
    in >> x >> y;
    if(x == y)
    {
        out << x << " " << 0 << "\n";
        return;
    }
    int aux = (sp[y] - sp[x - 1]) / 2;
    int st = x;
    int dr = y;
    int med = 0;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(sp[mij - 1] - sp[x - 1] < aux)
        {
            med = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
    }
    out << med << " ";
    out << dist[med] - (dist[x] + sp[x - 1] * (med - x)) + distdr[med] - (distdr[y] + (sp[n] - sp[y]) * (y - med)) << "\n";
    ///    stanga    fara cele din stanga                       + dreapta         fara cele din dreapta
}

int32_t main()
{
    int m;
    in >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        in >> v[i];
        sp[i] = sp[i - 1] + v[i];
    }
    for(int i = 1; i <= n; i++)
        dist[i] = dist[i - 1] + sp[i - 1];
    for(int i = n; i >= 1; i--)
        distdr[i] = distdr[i + 1] + (sp[n] - sp[i]);
    for(int i = 1; i <= m; i++)
        solve();
    return 0;
}