Cod sursa(job #2874561)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 19 martie 2022 17:11:00
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define LIM 1<<17
#define NMAX 250000
/// TONI BO$$ was here
/// #MLC

using namespace std;
char BUF[LIM];
int poz;

inline char getChar(){
    poz++;
    if(poz>=LIM){
    	fread(BUF,LIM,1,stdin);
    	poz=0;
    }
    return BUF[poz];
}

inline int getNr(){
    int r=0, semn=1;
    char ch=getChar();
    while(isdigit(ch)==0 && ch!='-') ch=getChar();
    if(ch=='-'){
        semn=-1;
        ch=getChar();
    }
    while(isdigit(ch)!=0){
        r=r*10+semn*(ch-'0');
        ch=getChar();
    }
    return r;
}

int v[NMAX + 2];
long long s_left[NMAX + 2], ss_left[NMAX + 2], ss_right[NMAX + 2], s_right[NMAX + 2];

long long verif(int i, int j, int k)
{
    return ss_left[k - 1] - ss_left[i - 1] - (k - i) * s_left[i - 1] + ss_right[k + 1] - ss_right[j + 1] - (j - k) * s_right[j + 1];
}

int main()
{
    int n, m, i, a, b, k, pas;
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    n = getNr();
    m = getNr();
    for(i = 1; i <= n; i++)
        v[i] = getNr();
    for(i = 1; i <= n; i++)
    {
        s_left[i] = s_left[i - 1] + v[i];
        ss_left[i] = ss_left[i - 1] + s_left[i];
        s_right[n - i + 1] = s_right[n - i + 2] + v[n - i + 1];
        ss_right[n - i + 1] = ss_right[n - i + 2] + s_right[n - i + 1];
    }
    for(i = 1; i <= m; i++)
    {
        a = getNr();
        b = getNr();
        k = a;
        pas = 1 << 17;
        while(pas)
        {
            if(k + pas <= b && verif(a, b, k + pas) <= verif(a, b, k + pas - 1))
                k += pas;
            pas /= 2;
        }
        printf("%d %lld\n", k, verif(a, b, k));
    }

    return 0;
}