Cod sursa(job #158074)

Utilizator MciprianMMciprianM MciprianM Data 13 martie 2008 13:55:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
using namespace std;

int maxarb[300000];
int n, m, start, finish, x, maxim, a, b, pos;

inline int max(int a, int b){
    return a>b?a:b;
}

void update(int nod, int left, int right){

  if(left==right){
    maxarb[nod]=x;
    return;
  }
  int m=(left+right)/2;
  if(pos<=m)  update(2*nod, left, m);
  else update(2*nod+1, m+1, right);
  maxarb[nod]=max(maxarb[2*nod], maxarb[2*nod+1]);

}
void query(int nod, int left, int right){
  if(start<=left&&right<=finish){
    maxim=(max(maxim, maxarb[nod]));
    return;
  }
  int m=(left+right)/2;
  if(start<=m)  query(2*nod, left, m);
  if(finish>m)  query(2*nod+1, m+1, right);
}

int main(){
  int i;
  freopen("arbint.in", "rt",stdin);
  freopen("arbint.out", "wt",stdout);
  scanf("%d%d", &n, &m);
  for(i=1;i<=n;i++){
    maxim=-1;
    scanf("%d", &x);
    pos=i;
    update(1,1,n);
  }
  for(i=0;i<m;i++){
    scanf("%d", &x);
    scanf("%d%d", &a, &b);
    if(x==0){
      maxim=-1;
      start=a, finish=b;
      query(1,1,n);
      printf("%d\n", maxim);
    }
    else {
      pos=a, x=b;
      update(1,1,n);
    }
  }
  fclose(stdin);
  fclose(stdout);
  return 0;
}