Cod sursa(job #465599)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 24 iunie 2010 21:25:36
Problema Cuburi2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#define ll long long

ll s[250005];
ll p[250005];
int v[250005],n,m;

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;
    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[i]);
    for(i=1;i<=n;i++)
    {
        s[i]=s[i-1]+v[i];
        p[i]=p[i-1]+(ll)v[i]*i;
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&c1,&c2);
        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;
}