Cod sursa(job #465586)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 24 iunie 2010 20:53:11
Problema Cuburi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#define ll long long

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


int main ()
{
    int i,mij,st,dr,c1,c2,sol;
    ll v1,v2;
    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;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            v1=p[c2]+p[c1-1]-2*p[mij]+mij*(2*s[mij]-s[c1-1]-s[c2];
            v2=p[c2]+p[c1-1]-2*p[mij+1]+(mij+1)*(2*s[mij+1]-s[c1-1]-s[c2];
            if(v1<v2)
            {
                sol=mij;
                dr=mij-1;
            }
            else
                st=mij+1;
        }
        v1=p[c2]+p[c1-1]-2*p[sol]+sol*(2*s[sol]-s[c1-1]-s[c2];
        printf("%d %lld\n",sol,v1);
    }
    return 0;
}