Cod sursa(job #2386111)

Utilizator andrei32576Andrei Florea andrei32576 Data 22 martie 2019 10:52:13
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
using namespace std;

#define inf 5000050001LL

int n,i,v[100004],t;
long long vMin[270000],x, Ad[270000];
int pMin[270000], poz;

ifstream f("biscuiti.in");
ofstream g("biscuiti.out");

void build_min(int nod,int st,int dr)
{
    if(st==dr)
    {
        pMin[nod]=st;
        vMin[nod]=v[st];
        return;
    }

    int mij=(st+dr)>>1;
    build_min(nod<<1,st,mij);
    build_min((nod<<1)+1,mij+1,dr);

    if(vMin[(nod<<1)+1] < vMin[nod<<1])
    {
        vMin[nod]=vMin[(nod<<1)+1];
        pMin[nod]=pMin[(nod<<1)+1];
    }
    else
    {
        vMin[nod]=vMin[nod<<1];
        pMin[nod]=pMin[nod<<1];
    }
}

void update(int nod, int st, int dr)
{
    if(st==dr && st==poz)
    {
        Ad[nod]=inf;
        vMin[nod]=inf;
        return;
    }

    int mij = (st+dr)>>1;
    if (mij < poz)
    {
        Ad[nod<<1]+=t;
        vMin[nod<<1]+=t;
        update((nod<<1)+1,mij+1,dr);
    }
    else
        update(nod<<1,st,mij);

    if(vMin[nod<<1]<=vMin[(nod<<1)+1])
    {
        vMin[nod]=vMin[nod<<1]+Ad[nod];
        pMin[nod]=pMin[nod<<1];
    }
    else
    {
        vMin[nod]=vMin[(nod<<1)+1]+Ad[nod];
        pMin[nod]=pMin[(nod<<1)+1];
    }
}

int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        f>>v[i];

    build_min(1,1,n);
    long long dif = 0;

    for(t=1;t<n;t++)
    {
        poz=pMin[1];
        x=vMin[1];
        dif+=x-v[poz];
        update(1,1,n);
    }

    poz=pMin[1];
    x=vMin[1];
    dif+=x-v[poz];

    g<<dif;

    f.close();
    g.close();
    return 0;
}