Cod sursa(job #1234641)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 27 septembrie 2014 18:49:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#define maxd 100010*4+50
#include <algorithm>

using namespace std;

int a[maxd];
int n,m;
int vl,ps,c,d;

int mxm,st ,dc;

inline int md(int l,int r){
   return l+(r-l)/2;
}
inline int left_son(int node){
   return (node<<1);
}
inline int right_son(int node){
   return (node<<1)|1;
}

void update(int node, int left,int right){
   if(left==right){
       a[node]=vl;
       return;
    }
   else{
    int mid=md(left,right);
    if(ps <= mid)
       update(left_son(node),left,mid);
    else
       update(right_son(node),mid+1,right);
    a[node]=max(a[right_son(node)],a[left_son(node)]);
  }
}

void qr(int node,int left,int right){
    if(st<=left && right<=dc)
        {mxm=max(mxm,a[node]);
         return;
        }
   
        int mid=md(left,right);
        if(st<=mid)
            qr(left_son(node),left,mid);
        if(mid<dc)
            qr(right_son(node),mid+1,right);

}
int main(void){
   freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);
   scanf(" %d %d", &n, &m);
   int i,x;
   for(i=1;i<=n;i++){
     scanf(" %d", &x);
     ps=i,vl=x;
     update(1,1,n);
   }
   while(m--){
     scanf("%d %d %d",&x,&c,&d);
     if(x){
        ps=c;
        vl=d;
        update(1,1,n);
     }
     else{
        mxm=-1;
        st=c;
        dc=d;
        qr(1,1,n);
        printf("%d\n",mxm);
     }
   }
}