Cod sursa(job #467508)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 29 iunie 2010 09:49:59
Problema Cuburi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>
#include<string.h>
#define ll long long

ll s[250005];
ll p[250005];
int n,m,nr,poz;
char ch[105];

inline ll calc(int& i,int& j,int& k)
{
    return (-2*p[k]+k*(2*s[k]-s[i-1]-s[j]));
}

int main ()
{
    int i,mij,st,dr,c1,c2,sol,m2,v;
    ll aux;
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v);
        s[i]=s[i-1]+v;
        p[i]=p[i-1]+(ll)v*i;
    }
    scanf("\n");
    for(i=1;i<=m;i++)
    {
        gets(ch);c1=0;
        nr=strlen(ch);
        poz=0;c2=0;
        while(ch[poz]!=' ')
        {
            c1*=10;
            c1+=(ch[poz]-'0');
            poz++;
        }
        poz++;
        while(poz<nr)
        {
            c2*=10;
            c2+=(ch[poz]-'0');
            poz++;
        }
        
        st=c1;
        dr=c2;sol=n;
        aux=p[c2]+p[c1-1];
        while(st<=dr)
        {
            mij=(st+dr)/2;
            m2=mij+1;
            if(calc(c1,c2,mij)<=calc(c1,c2,m2))
            {
                sol=mij;
                dr=mij-1;
            }
            else
                st=m2;
        }
        printf("%d %lld\n",sol,aux+calc(c1,c2,sol));
    }
    return 0;
}