Cod sursa(job #1925828)

Utilizator giotoPopescu Ioan gioto Data 13 martie 2017 19:06:56
Problema Cuburi2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
using namespace std;

int n, m, a[250002];
long long s[250002], s1[250002], s2[250002], sd[250002], sp[250002];
int main()
{
    freopen("cuburi2.in", "r", stdin);
    freopen("cuburi2.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n ; ++i){
        scanf("%d", &a[i]);
        sd[i] = sd[i - 1] + a[i];
    }
    for(int i = n; i >= 1 ; --i)
        sp[i] = sp[i + 1] + a[i];
    for(int i = 1; i <= n ; ++i){
        s1[i] = s1[i - 1] + sd[i - 1];
        s[i] += s1[i];
    }
    for(int i = n; i >= 1 ; --i){
        s2[i] += s2[i + 1] + sp[i + 1];
        s[i] += s2[i];
    }
    int x, y;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d", &x, &y);
        int st = x, dr = y, pos = x;
        while(st <= dr){
            int mij = (st + dr) / 2;
            if(sd[mij - 1] - sd[x - 1] < sd[y] - sd[mij - 1]){
                st = mij + 1;
                pos = mij;
            }
            else dr = mij - 1;
        }
        long long Sol = s1[pos] - s1[x] + s2[pos] - s2[y];
        printf("%d %lld\n", pos, Sol);
    }

    return 0;
}