Cod sursa(job #2258683)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 11 octombrie 2018 20:03:59
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N=250000+5;

int n,q;
int h[N];
ll p[N],s[N];

ll sm[N];

inline ll gt(int st,int dr)
{
    return sm[dr]-sm[st-1];
}

inline ll ask(int st,int pivot,int dr)
{
    if(1<=st && st<=pivot && pivot<=dr && dr<=n)
    {
        ll dif1=s[st]-s[pivot+1],dif2=p[dr]-p[pivot-1];
        return dif1-gt(st,pivot)*(long long)(n+1-pivot)+dif2-gt(pivot,dr)*(long long)pivot;
    }
    return (1LL<<60);
}

int F,S;

inline ll f(int id)
{
    return ask(F,id,S);
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    freopen("cuburi2.in","r",stdin);
    freopen("cuburi2.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>h[i];
    for(int i=1;i<=n;i++) sm[i]=sm[i-1]+h[i];
    for(int i=1;i<=n;i++)
    {
        p[i]=p[i-1]+i*(long long)h[i];
    }
    for(int i=n;i>=1;i--)
    {
        s[i]=s[i+1]+(n+1-i)*(long long)h[i];
    }
    while(q--)
    {
        int lo,hi; cin>>lo>>hi;
        F=lo;
        S=hi;
        int ans=lo;
        while(lo<=hi)
        {
            int mid=(lo+hi)/2;
            if(f(mid)<f(mid+1))
            {
                ans=mid;
                hi=mid-1;
            }
            else
                lo=mid+1;
        }
        cout<<ans<<" "<<f(ans)<<"\n";
    }
    return 0;
}