Cod sursa(job #2005677)

Utilizator victoreVictor Popa victore Data 27 iulie 2017 19:12:01
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<cstdio>

using namespace std;

const int nmax=250005;
long long v[nmax],spdr[nmax],sp[nmax],mutdr[nmax],mutst[nmax];

inline int bsearch(int st,int dr)
{
    int i,step;
    for(step=1;step<=dr-st+1;step<<=1);
    for(i=st;step;step>>=1)
        if(i+step<=dr && sp[i+step-1] - sp[st-1] <= sp[dr] - sp[i+step-1])
            i+=step;
    return i;
}

int main()
{
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    int x,y,n,i,j,q;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
    {
        scanf("%lld",&v[i]);
        sp[i]=sp[i-1]+v[i];
        mutdr[i]=mutdr[i-1] +sp[i-1];
    }
    for(i=n;i;--i)
    {
        spdr[i]=spdr[i+1] + v[i];
        mutst[i]=mutst[i+1] + spdr[i+1];
    }
    while(q--)
    {
        scanf("%d%d",&x,&y);
        int poz=bsearch(x,y);
        long long s1,s2;
        s1=1LL*mutdr[poz] - mutdr[x] - sp[x-1]*(poz-x);
        s2=1LL*mutst[poz] - mutst[y] - spdr[y+1]*(y-poz);
        s1+=s2;
        printf("%d %lld\n",poz,s1);
    }
}