Cod sursa(job #1608460)

Utilizator robertstrecheStreche Robert robertstreche Data 22 februarie 2016 09:12:13
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

#define NMAX 100005
#define max(a,b) a>b?a:b

using namespace std;

int val[4*NMAX];
int n,q,st,dr,valoare,poz,type;


inline void update(int nod,int a,int b,int poz){
  if (a==b)val[nod]=valoare;
  else{
    int m=(a+b)/2;
    if (poz<=m)update(2*nod,a,m,poz);
    else update(2*nod+1,m+1,b,poz);
    val[nod]=max(val[2*nod],val[2*nod+1]);
  }
}

inline int query(int nod,int a,int b){
   if (st<=a && b<=dr)return val[nod];
   else {
       int m=(a+b)/2;
       if (st<=m && m<dr)return max(query(2*nod,a,m),query(2*nod+1,m+1,b));
       else if (st<=m)return query(2*nod,a,m);
       return query(2*nod+1,m+1,b);
   }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d",&n,&q);

    for (int i=1;i<=n;i++){
        scanf("%d",&valoare);
        update(1,1,NMAX,i);
    }
    for (;q;q--){
        scanf("%d",&type);
        if (!type){
           scanf("%d %d\n",&st,&dr);
           printf("%d\n",query(1,1,NMAX));
        }
        else{
           scanf("%d %d",&poz,&valoare);
           update(1,1,NMAX,poz);
        }
    }
    fclose(stdin);
    fclose(stdout);
}