Cod sursa(job #2005682)

Utilizator victoreVictor Popa victore Data 27 iulie 2017 19:32:42
Problema Cuburi2 Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<cstdio>

using namespace std;

const int nmax=1e5+5;

int n,q;
int v[nmax];
long long sp[nmax],mdr[nmax],mst[nmax];

inline long long sum(int a,int b)
{
    return sp[b]-sp[a-1];
}

inline void pre()
{
    int i;
    for(i=1;i<=n;++i)
        sp[i]=sp[i-1]+1LL*v[i];
    for(i=1;i<=n;++i)
        mst[i]=mst[i-1]+sp[i-1];
    for(i=n;i;--i)
        mdr[i]=mdr[i+1] + sum(i+1,n);
}

inline int bsearch(int x,int y)
{
    int i,step;
    for(step=1;step<=y-x;step<<=1);
    for(i=x;step;step>>=1)
        if(i+step <= y && sum(x,i+step-1) < sum(i+step , y))
            i+=step;
    return i;
}

inline void solve(int x,int y)
{
    int poz=bsearch(x,y);
    printf("%d %lld\n",poz,(mst[poz] - mst[x] - mst[x-1]*(poz-x) + mdr[poz] - mdr[y] - sum(y+1,n)*(y-poz)));
}

int main()
{
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    int i;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    pre();
    int x,y;
    while(q--)
    {
        scanf("%d%d",&x,&y);
        solve(x,y);
    }
}