Cod sursa(job #1081565)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 13 ianuarie 2014 18:46:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<fstream>
using namespace std;

int n,m,maxarb[400010],start,finish,val,pos,maxim;

void Actualizare(int nod, int st, int dr) {

     if ( st == dr ) {
          maxarb[nod] = val;
          return;
     }

     int div=(st+dr)/2;
     if (pos<=div)
        Actualizare(2*nod,st,div);
     else
        Actualizare(2*nod+1,div+1,dr);


     if(maxarb[2*nod]>maxarb[2*nod+1])
        maxarb[nod] = maxarb[2*nod];
     else
        maxarb[nod] = maxarb[2*nod+1];

}

void Interogare(int nod, int st, int dr) {
     if ( start <=st && dr<= finish )
     {
          if ( maxim < maxarb[nod] )
            maxim = maxarb[nod];
          return;
     }

     int div=(st+dr)/2;
     if (start<= div) Interogare(2*nod,st,div);
     if ( div<finish ) Interogare(2*nod+1,div+1,dr);
}

int main() {

    int a,b,cer,i;

    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in>>n>>m;
    for(i=1;i<=n;i++) {
        in>>val;
        pos=i;
        Actualizare(1,1,n);
    }

    for(i=1;i<=m;i++) {

        in>>cer>>a>>b;
        if(cer==0) {
        maxim=-1;
            start=a;
            finish=b;
            Interogare(1,1,n);
            out<<maxim<<'\n';
        }
        else {
            pos=a;
            val=b;
            Actualizare(1,1,n);

        }
    }

    in.close();
    out.close();
    return 0;
}