Cod sursa(job #2822543)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 24 decembrie 2021 10:40:35
Problema Cuburi2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>

using namespace std;

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

const int maxN = 250005;
int n, q;
int v[maxN], sp_st[maxN], sp_dr[maxN], c_st[maxN], c_dr[maxN];

int main()
{
    fin >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        fin >> v[i];
        sp_st[i] = v[i] + sp_st[i - 1];
        c_st[i] = c_st[i - 1] + sp_st[i - 1];
    }
    for(int i = n; i >= 1; i--)
    {
        sp_dr[i] = v[i] + sp_dr[i + 1];
        c_dr[i] = c_dr[i + 1] + sp_dr[i + 1];
    }
    for(int i = 1; i <= q; i++)
    {
        int a, b, maxi = 1, poz;
        fin >> a >> b;
        while(maxi * 2 <= (b - a))
            maxi = maxi * 2;
        poz = a;
        for(int i = maxi; i > 0; i >>= 1)
        {
            if(poz + i <= b && ((sp_st[poz + i - 1] - sp_st[a - 1]) < (sp_dr[poz + i + 1] - sp_dr[b + 1])))
                poz = poz + i;
        }
        if((sp_st[poz] - sp_st[a - 1]) - (sp_dr[poz + 2] - sp_dr[b + 1]) < ((sp_dr[poz + 1] - sp_dr[b + 1]) - (sp_st[poz - 1] - sp_st[a - 1])))
            poz++;
        long long cost;
        cost = (c_st[poz] - c_st[a - 1] - (poz - a + 1) * sp_st[a - 1]) + (c_dr[poz] - c_dr[b + 1] - (b - poz + 1) * sp_dr[b + 1]);
        fout << poz << ' ' << cost << '\n';
    }
    return 0;
}