Cod sursa(job #2273757)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 31 octombrie 2018 21:36:19
Problema Cuburi2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <cmath>

const int VM = 25 * 10e4 ;
const int R(30) ;

int v[VM] ;
long long st[VM], dr[VM], mst[VM], mdr[VM] ;

inline int solve(int a, int b) {
    int poz(a), step(1 << R) ;
    while (step) {
        if (poz + step <= b && st[poz + step - 1] - st[a - 1] < st[b] - st[poz + step - 1])
                poz += step;
        step >>= 1 ;
    }
    return poz ;
}

int main()
{
    freopen("cuburi2.in","r",stdin) ;
    freopen("cuburi2.out","w",stdout) ;
    int n, m, x, y ;
    scanf("%d %d", &n, &m) ;
    register int i ;
    for (i = 1 ; i <= n ; ++ i) {
        scanf("%d",&v[i]) ;
        st[i] = st[i - 1] + v[i] ;
        mdr[i] = mdr[i - 1] + st[i - 1] ;
    }
    for (i = n ; i >= 1 ; -- i) {
        dr[i] = dr[i + 1] + v[i] ;
        mst[i] = mst[i + 1] + dr[i + 1] ;
    }
    for (i = 1 ; i <= m ; ++ i) {
        scanf("%d %d", &x, &y) ;
        int turn(solve(x, y)) ;
        long long ans(0) ;
        ans += mdr[turn] - mdr[x] - st[x - 1] * (turn - x) ;
        ans += mst[turn] - mst[y] - dr[y + 1] * (y - turn) ;
        printf("%d %lld\n", turn, ans) ;
    }
    return 0;
}