Pagini recente » Cod sursa (job #873512) | Cod sursa (job #1913245) | Cod sursa (job #1212823) | Cod sursa (job #2111208) | Cod sursa (job #2770177)
#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;
}