Cod sursa(job #2334209)

Utilizator sichetpaulSichet Paul sichetpaul Data 2 februarie 2019 12:34:27
Problema Cuburi2 Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#define DIM 250002
using namespace std;
long long sum1[DIM],sum2[DIM],st[DIM],dr[DIM];
long long GetCost(int i,int j,int pos) {
    long long sum=0;
    sum=st[pos]-st[i-1]-(pos-i+1)*sum1[i-1];
   sum+=dr[pos]-dr[j+1]-(j-pos+1)*sum2[j+1];
    return sum;
}
int main()
{   int n,m,i,j,pos;long long l,r,mid,sol,x,c1,c2,c3;
    ifstream f("cuburi2.in");
    ofstream g("cuburi2.out");
    f>>n>>m;
    for (i=1;i<=n;++i) {
        f>>x;
        sum1[i]=sum1[i-1]+x,st[i]=st[i-1]+sum1[i-1];
    }
    for (i=n;i>=1;--i)
        sum2[i]=sum2[i+1]+sum1[i]-sum1[i-1],dr[i]=dr[i+1]+sum2[i+1];

    for (int q=1;q<=m;++q) {
        f>>i>>j;
        l=i,r=j;
        while (l<=r) {
            mid=(l+r)/2;
            if (mid==l || mid==r) {
                if (GetCost(i,j,l)<GetCost(i,j,r)) pos=l,sol=GetCost(i,j,l);
                else pos=r,sol=GetCost(i,j,r);
                break;
            }

            c1=GetCost(i,j,mid-1);
            c2=GetCost(i,j,mid);
            c3=GetCost(i,j,mid+1);
            if (c1>=c2 && c2>=c3) l=mid+1;
            else if (c1<=c2 && c2<=c3) r=mid-1;
            else {
                pos=mid;
                sol=c2;
                break;
            }
        }
          g<<pos<<" "<<sol<<'\n';
    }
    return 0;
}