Cod sursa(job #254745)

Utilizator devilkindSavin Tiberiu devilkind Data 7 februarie 2009 13:57:29
Problema Cuburi2 Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.8 kb
#include <stdio.h>

#define NMAX 250010

unsigned long long ST[NMAX];
unsigned long long DR[NMAX];
unsigned long long A[NMAX];
unsigned long long S[NMAX];
unsigned long long D[NMAX];
unsigned long long N, M;

inline long long sum(unsigned long long p, unsigned long long x, unsigned long long y)
{
    unsigned long long s1, s2;

    s1 = DR[x] - DR[p] - ((unsigned long long) D[x] - D[p]) * (N - p + 1);
    s2 = ST[y] - ST[p] - ((unsigned long long) S[y] - S[p]) * p;
    return s1 + s2;
}

int main()
{
        freopen("cuburi2.in", "r", stdin);
        freopen("cuburi2.out", "w", stdout);

        unsigned long long i, j, st, dr, mid;        
        unsigned long long ans, poz, l, r;
        unsigned long long x, y;

        scanf("%llu %llu ", &N, &M);
        for (i = 1; i <= N; i++)
                scanf("%llu ", &A[i]);
        
        for (i = 1; i <= N; i++)
        {
                ST[i] = ST[i - 1] + A[i] * i;
                S[i] = S[i - 1] + A[i];
        }

        for (i = N; i; i--)
        {
                DR[i] = DR[i + 1] + A[i] * (N - i + 1);
                D[i] = D[i + 1] + A[i];
        }

        for (i = 1; i <= M; i++)
        {
            scanf("%llu %llu ", &x, &y);

            st = x; dr = y;
            while (st < dr - 5) 
            {
                mid = (st + dr) / 2;

                l = mid - 1;
                r = mid + 1;

                if (sum(l, x, y) < sum(r, x, y)) dr = r;
                    else st = l;
            }

            poz = st;
            ans = sum(st, x, y);
            for (j = st; j <= dr; j++)
                    if (sum(j, x, y) < ans)
                        {
                            ans = sum(j, x, y);
                            poz = j;
                        }
            printf("%llu %llu\n", poz, ans);
        }

        return 0;
}