Cod sursa(job #1058502)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 15 decembrie 2013 16:57:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#define maxnod 262155//(1<<18)=262144
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");

int i,n,m,arb[maxnod];
int oper,a,b,x,poz,q;

inline int max(int a,int b){
       if (a>b) return a;
       else return b;
}

void creare_arb(int nod,int st,int dr){
     if (st==dr) fi>>arb[nod];
     else{
          creare_arb(2*nod,st,(st+dr)/2);
          creare_arb(2*nod+1,(st+dr)/2+1,dr);
          arb[nod]=max(arb[2*nod],arb[2*nod+1]);
         }
}

void query(int nod,int st,int dr){
     if(a<=st && dr<=b){
                        if(arb[nod]>q) q=arb[nod];
                       }
     else{
          int mijl=(st+dr)/2;
          if(a<=mijl) query(2*nod,st,mijl);
          if(mijl+1<=b) query(2*nod+1,mijl+1,dr);
         } 
}

void update(int nod,int st,int dr){
     if(st==dr) arb[nod]=x;
     else{
          int mijl=(st+dr)/2;
          if(poz<=mijl) update(2*nod,st,mijl);
          else update(2*nod+1,mijl+1,dr);
          arb[nod]=max(arb[2*nod],arb[2*nod+1]);
         }
}

int main(){
    fi>>n>>m;
    
    creare_arb(1,1,n);
   
    for(i=1;i<=m;i++){
                      fi>>oper;
                      if(oper==0){
                                  fi>>a>>b; q=0;
                                  query(1,1,n);
                                  fo<<q<<"\n";
                                 }
                      else{
                           fi>>poz>>x;
                           update(1,1,n);
                          }
                     }   
    
    fi.close();
    fo.close();
    return 0;
}