Cod sursa(job #1207900)
Utilizator | Data | 14 iulie 2014 11:40:57 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.31 kb |
#include <fstream>
using namespace std;
ifstream cin("biscuiti.in");
ofstream cout("biscuiti.out");
int n,m,i,A[300013],P[300013],AUX[300013],op,a,b,val,t,poz_min,suma(0),sum1(0),minim,aux,j,k;
void update(int nod,int st,int dr)
{
if (st==dr) A[nod]=b , P[nod]=st;
else {
int mij =(st+dr)/2;
if (a<=mij) update(nod*2,st,mij);
else update(nod*2+1,mij+1,dr);
A[nod]=min(A[2*nod],A[2*nod+1]);
if(A[2*nod]==A[2*nod+1]) P[nod]=min(P[2*nod],P[2*nod+1]);
else
if(A[nod]==A[2*nod]) P[nod]=P[2*nod];
else
if (A[nod]==A[2*nod+1]) P[nod]=P[nod*2+1];
}
}
void query (int nod,int st,int dr)
{
if (1<=st && n>=dr) {
if (minim>A[nod]){
poz_min=P[nod];
minim=A[nod];
}
//if (minim==A[nod]) poz_min=min(poz_min,P[nod]);
}
else {
int mij=(st+dr) /2;
if (1<=mij) query (2*nod,st,mij);
if (n>mij) query (2*nod+1,mij+1,dr);
}
}
int main()
{
cin>>n;
for (i=1;i<=n;++i) {
cin>>AUX[i];
sum1+=AUX[i];
b=AUX[i];
a=i;
update(1,1,n);
}
for (i=1;i<=n;++i){
minim=1<<30;
poz_min=1<<30;
query(1,1,n);
suma+=minim;
a=poz_min;
AUX[poz_min]=1<<30;
b=1<<30;
update(1,1,n);
k=a;
for (j=1;j<k;++j){
AUX[j]+=i;
a=j;
b=AUX[j];
update(1,1,n);
}
}
cout<<suma-sum1;
return 0 ;
}