Cod sursa(job #3343231)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 26 februarie 2026 18:10:26
Problema Cuburi2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("cuburi2.in");
ofstream fout("cuburi2.out");

const int Nmax = 250000 + 5;
int v[Nmax], n, m;
long long sp[Nmax], pre[Nmax], suf[Nmax], sp2[Nmax];
long long calcPre(int st, int dr)
{
    if ( st > dr )
        return 0;

    return pre[dr] - pre[st - 1] - (dr - st + 1) * sp[st - 1];
}
long long calcSuf(int st, int dr )
{
    if (st > dr )
        return 0;
    // cout << suf[st] << " " << suf[dr + 1] << endl;
    return suf[st] - suf[dr + 1] - (sp[n] - sp[dr]) *(dr - st + 1);
}
int main()
{
    int i;
    fin >> n >> m;
    for ( i = 1; i <= n; ++i )
    {
        fin >> v[i];
        sp[i] = sp[i - 1] + v[i];
        pre[i] = pre[i - 1] + sp[i];
    }
	sp[n + 1] = sp[n];
    long long sum = 0;
    for ( i = n; i >= 1; --i )
    {
        sum = sum + v[i];
        suf[i] = suf[i + 1] + sum;
    }


    for ( i = 1; i <= m; ++i )
    {
        int st, dr, mij, x, y;
        fin >> x >> y;
        st = x;
        dr = y;
		int sol = x;

        long long s = (sp[dr] - sp[st - 1]) / 2;
        while ( st <= dr )
        {
            mij = (st + dr) / 2;
            if ( sp[mij] - sp[x - 1] <= s )
            {
                sol = mij;
                st = mij + 1;
            }
            else
                dr = mij - 1;
        }
        // fout << "sol = " << sol << endl;
        fout << sol << ' ' << 0 << '\n';
//        long long cand1 = calcPre(x, sol - 1) + calcSuf(sol + 1, y);
//        ++sol;
//        long long cand2 = calcPre(x, sol - 1) + calcSuf(sol + 1, y);
//        if ( cand1 < cand2 || x == y )
//            fout << sol - 1 << " " << cand1 << '\n';
//        else
//            fout << sol << " " << cand2 << '\n';
    }
    return 0;
}