Cod sursa(job #2770177)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 19 august 2021 18:19:23
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>

using namespace std;

ifstream cin ("biscuiti.in");
ofstream cout ("biscuiti.out");

const int maxn=100000, inf = 1e9;
int start, queryType, x, y, n, m, sum, sum_initial;
int a[4*maxn], lazy[4*maxn];

void update(int nod){
    while(nod!=1){//cata vreme mai pot urca
        nod/=2;//urcam un nod
        a[nod]=min(a[2*nod] + lazy[2*nod], a[2*nod+1] + lazy[2*nod + 1]);//actualizez cu maximul dinre fii
    }
}
int minimumPosition(int x){
    //cand corectasem prima oara am pus x <= start in loc sa pun <= in if, oops
   while(x<start){//cat mai am unde cobori
    if(a[2*x]+lazy[2*x]<=a[2*x+1]+lazy[2*x+1])//daca e mai mic in stanga ///aici e <= , nu <, pentru ca la egalitate mergem la stanga
        x=2*x;//acolo ma duc

    else
        x=2*x+1;//idem la dreapta
   }
   return x;//dupa analize Da Capo Al Fine, intorc locul
}
void lazy_update(int lo, int hi, int value){
    if(lo<hi){ ///inainte era lo > hi
      if(lo%2==1){
        lazy[lo]+=value;
        update(lo);
        lo++;
      }
      if(hi%2==0){
        lazy[hi]+=value;
        update(hi);
        hi--;
      }
      lo/=2, hi/=2;
      lazy_update(lo, hi, value);
    }
    else if(lo==hi){
        lazy[lo]+=value;
        update(lo);
    }
}

int main()  {
    cin >> n; ///inainte citisem n si m
    start = 1;
    while (start < n)
        start <<= 1;
    for (int i = start + n; i < start + start; ++i) {
        a[i] = inf;
        update(i); ///am uitat sa facem update aici
    }
    for(int i=start; i<start+n; i++){
        cin>>a[i];
        update(i);//actualizam arborele
        sum_initial += a[i];
    }
    for (int i = 1; i <= n; ++i)    {
        sum+=a[1];//actualizam suma
        a[minimumPosition(1)]=inf;//pun o valoare imeensa
        update(minimumPosition(1));//si modific in sus tot, asfel incat
        lazy_update(start, minimumPosition(1), i);
    }//la un nou apel, sa am tot minimul sus
    cout << sum - sum_initial;
    return 0;
}