Cod sursa(job #1207900)

Utilizator azkabancont-vechi azkaban 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 ;
}