Cod sursa(job #265312)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 23 februarie 2009 19:34:42
Problema Cuburi2 Scor 22
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>

using namespace std;

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

#define NMAX 260000
#define ll long long

struct dir { ll l,r; };

ll A[NMAX], N, M, x, y;
dir Sum[NMAX], Cost[NMAX];

inline int CautBin(int st, int end)
{
        ll m, ok, msum;
        
        msum = (Sum[y].l - Sum[x-1].l) / 2 + Sum[x - 1].l;

        m = st + end / 2;
        while (st <= end)
        {
                m = (st + end) / 2;
                if (Sum[m - 1].l < msum && Sum[m].l >= msum)
                        end = st - 1;
                else
                {
                        if (Sum[m].l < msum) st = m + 1;
                        if (Sum[m].l >= msum) end = m - 1;
                }
        }
        return m;
}
int main()
{
        ll i, j, i2, sol, cost;
        fin >>N >>M;
        for (i = 1; i <= N; i++)
                fin >>A[i];

        for (i = 1, j = N; i <= N; i++, j--)            //Calcularea Costurilor / Precalcularea sumelor
        {
                Sum[i].l = Sum[i-1].l + A[i];
                Sum[j].r = Sum[j+1].r + A[j];
                Cost[i].l = Cost[i-1].l + Sum[i-1].l;
                Cost[j].r = Cost[j+1].r + Sum[j+1].r;
        }

        for (i2 = 1; i2 <= M; i2++)
        {
                fin >>x >>y;
                sol = CautBin(x, y);
                cost = (Cost[sol].l - Cost[x].l - (sol-x)*A[x-1]) + (Cost[sol].r - Cost[y].r - (y-sol)*A[y+1]);
                fout <<sol <<' ' <<cost <<'\n';
                
        }
        fout.close();
        return 0;

}