Cod sursa(job #1002965)

Utilizator thewildnathNathan Wildenberg thewildnath Data 29 septembrie 2013 14:17:15
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h>

long long v[250002],aux[250002],sd[250002],ss[250002];
long long n,st,dr,x,y;

inline long long caut(long long l1,long long l2)
{
    long long m;
    st=x;dr=y;
    while(st<dr)
    {
        m=(st+dr)/2;
        if(v[m]-l1>aux[m]-l2)
            dr=m;
        else
            st=m+1;
    }
    return st;
}

inline long long ch()
{
    long long nr=0;
    char c;
    scanf("%c",&c);
    while(c<='0'&&c>='9')
        scanf("%c",&c);
    while(c>='0'&&c<='9')
    {
        nr=nr*10+c-'0';
        scanf("%c",&c);
    }
    return nr;
}

int main()
{
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    long long m,i,j,s=0,sol1,sol2;
    scanf("%lld%lld\n",&n,&m);
    for(i=1;i<=n;++i)
    {
        //scanf("%lld",&ss[i]);
        ss[i]=ch();
        s+=ss[i];
    }
    for(i=1;i<=n;++i)
    {
        v[i]=v[i-1]+ss[i];
        aux[i]=s-v[i];
    }
    for(i=1;i<=n;++i)
        ss[i]=ss[i-1]+v[i-1];
    for(i=n;i>0;--i)
        sd[i]=sd[i+1]+aux[i];
    //////////////////////////////
    while(m--)
    {
        //scanf("%lld%lld",&x,&y);
        x=ch();
        y=ch();
        sol1=caut(v[x-1],aux[y]);
        sol2=ss[sol1]-ss[x]-v[x-1]*(sol1-x)+sd[sol1]-sd[y]-aux[y]*(y-sol1);
        printf("%lld %lld\n",sol1,sol2);
    }

    return 0;
}