Cod sursa(job #2080376)

Utilizator DovlecelBostan Andrei Dovlecel Data 2 decembrie 2017 21:02:17
Problema Cuburi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cuburi2.in");
ofstream g("cuburi2.out");
const int K=250000;
int v[1+K+1],n,m;
long long st[1+K+1],dr[1+K+1],sum1[1+K+1],sum2[1+K+1];
long long cost(int i, int j)
{
    long long cost=0;
    if(i<j)
        cost=st[j]-st[i]-(j-i)*sum1[i-1];
    else
        cost=dr[j]-dr[i]-(i-j)*sum2[i+1];
    return cost;
}
int p(int x, int y)
{
    int k=1;
    while(k<y-x)
        k=2*k;
    return k;
}
int main()
{
    int x,y,i,r,pas;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>v[i];
        sum1[i]=sum1[i-1]+v[i];
        st[i]=st[i-1]+sum1[i-1];
    }
    for(i=n;i>=1;i--)
    {
        sum2[i]=sum2[i+1]+v[i];
        dr[i]=dr[i+1]+sum2[i+1];
    }
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        pas=p(x,y);
        r=0;
        while(pas!=0)
        {
            if(x+r+pas<=y)
                if(cost(x,x+r+pas)+cost(y,x+r+pas)<=cost(x,x+r+pas-1)+cost(y,x+r+pas-1))
                    r=r+pas;
            pas=pas/2;
        }
        g<<x+r<<' '<<cost(x,x+r)+cost(y,x+r)<<'\n';
    }
    return 0;
}