Cod sursa(job #1200722)

Utilizator azkabancont-vechi azkaban Data 23 iunie 2014 14:01:04
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");

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

int query (int nod,int  st ,int dr ,int poz_st,int poz_dr,int A[],int &maxim)
{
  if (poz_st<=st && poz_dr>=dr) return A[nod];
        else {
              int mij=(st+dr) /2;
              if (poz_st<=mij) return query (2*nod,st,mij,poz_st,poz_dr,A,maxim);
              if (poz_dr>mij)  return query (2*nod+1,mij+1,dr,poz_st,poz_dr,A,maxim);
              return max(query (2*nod,st,mij,poz_st,poz_dr,A,maxim),query (2*nod+1,mij+1,dr,poz_st,poz_dr,A,maxim));
              }
}
int n,m,i,A[300013],op,a,b,maxim,val;
int main()
{
    cin>>n>>m;
    for (i=1;i<=n;++i) { 
                        cin>>val;
                        update(1,1,n,i,val,A);
                        }
    while (m--){
                 cin>>op>>a>>b;
                 if (op==0) cout<<query(1,1,n,a,b,A,maxim)<<"\n";
                 if (op==1) update(1,1,n,a,b,A);
               }
return 0 ;
}