Cod sursa(job #1296262)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 20 decembrie 2014 19:14:30
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <fstream>
#define INF 4611686018427387903
using namespace std;

ifstream fin("biscuiti.in");
ofstream fout("biscuiti.out");
long long  v[100003],n,i;
unsigned long long sum,s;
struct {long long m,a,p;}A[400003];

void build(long long nod,long long p,long long u){
    if(p==u){
        fin>>A[nod].m;
        s+=A[nod].m;
        A[nod].p=p;
        return;
    }
    long long mid=(p+u)/2;
    build(2*nod,p,mid);
    build(2*nod+1,mid+1,u);
    long long left=A[2*nod].m+A[2*nod].a;
    long long right=A[2*nod+1].m+A[2*nod+1].a;
    if(left<=right){
        A[nod].m=left;
        A[nod].p=A[2*nod].p;
    }
    else{
        A[nod].m=right;
        A[nod].p=A[2*nod+1].p;
    }
}
void update(long long nod,long long p,long long u,long long a,long long b,long long val){
    if(a<=p && u<=b){
        A[nod].a+=val;
        return;
    }
    if(p==u)
        return;
    long long mid=(p+u)/2;
    if(a<=mid){
        A[2*nod].a+=A[nod].a;
        A[2*nod+1].a+=A[nod].a;
        A[nod].a=0;
        update(2*nod,p,mid,a,b,val);
    }
    if(b>mid){
        A[2*nod].a+=A[nod].a;
        A[2*nod+1].a+=A[nod].a;
        A[nod].a=0;
        update(2*nod+1,mid+1,u,a,b,val);
    }
    long long left=A[2*nod].m+A[2*nod].a;
    long long right=A[2*nod+1].m+A[2*nod+1].a;
    if(left<=right){
        A[nod].p=A[2*nod].p;
        A[nod].m=A[2*nod].m;
    }
    else{
        A[nod].p=A[2*nod+1].p;
        A[nod].m=A[2*nod+1].m;
    }

}
void sterge(long long nod,long long p,long long u,long long a){
    if(p==u){
        A[nod].m=INF;
        A[nod].a=0;
        return;
    }
    if(p>u || (a<p && a<u) || (a>p && a>u))
        return;
    long long mij=(p+u)/2;
    if(a<=mij){
        A[2*nod].a+=A[nod].a;
        A[2*nod+1].a+=A[nod].a;
        A[nod].a=0;
        sterge(2*nod,p,mij,a);
    }
    if(a>mij){
        A[2*nod].a+=A[nod].a;
        A[2*nod+1].a+=A[nod].a;
        A[nod].a=0;
        sterge(2*nod+1,mij+1,u,a);
    }
    long long left=A[2*nod].m+A[2*nod].a;
    long long right=A[2*nod+1].m+A[2*nod+1].a;
    if(left<=right){
        A[nod].m=left;
        A[nod].p=A[2*nod].p;
    }
    else{
        A[nod].m=right;
        A[nod].p=A[2*nod+1].p;
    }
}
int main(){
    fin>>n;
    build(1,1,n);
    for(i=1;i<=n;i++){
        sum+=A[1].m;
        update(1,1,n,1,A[1].p-1,i);
        sterge(1,1,n,A[1].p);
    }
    fout<<sum-s<<'\n';
    fin.close();fout.close();
    return 0;
}