Cod sursa(job #2864681)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 8 martie 2022 09:15:23
Problema Cuburi2 Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
typedef long long ll;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");
ll n,m,i,j,a[250002],b[250002],c[250002],d[250002],e[250002],x,y,ee,ff,o,s=LLONG_MAX;
ll f(ll q){return c[q]-c[x]-b[x-1]*(q-x)+e[q]-e[y]-d[y+1]*(y-q);}
int main()
{
in>>n>>m;
for(i=1;i<=n;i++)
    in>>a[i],c[i]=c[i-1]+b[i-1],b[i]=b[i-1]+a[i];
for(i=n;i>=0;i--)e[i]=e[i+1]+d[i+1],d[i]=d[i+1]+a[i];
while(m--)
{
    in>>x>>y;
    ee=x,ff=y,s=LLONG_MAX;
    while(ee!=ff)
    {
        o=(ee+ff)/2;
        //cout<<ee<<' '<<ff<<' '<<o<<' '<<f(o)<<'\n';
        s=bmin(s,f(o));
        if(o>x)
            if(f(o-1)<s)
                ff=o;
                else ee=o;
            else ee=o;
         if(o<y&&ee<=o)
            if(f(o+1)<s)
                ee=o+1;
                else ff=o;
                else ff=o;
    }
    o=(ee+ff)/2;
        s=bmin(s,f(o));
    out<<ee<<' '<<s<<'\n';
}
}