Cod sursa(job #313764)

Utilizator mlazariLazari Mihai mlazari Data 9 mai 2009 17:30:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define NMAX 100000

int op,a,b,i,n,m,val,poz,st,fin,max,arb[4*NMAX];

void update(int i,int l,int r) {
  if(l==r) arb[i]=val;
  else {
    int mid=l+(r-l)/2;
    if(poz>mid) update(2*i+1,mid+1,r);
    else update(2*i,l,mid);
    arb[i]=(arb[2*i]>arb[2*i+1])?arb[2*i]:arb[2*i+1];
  }
}

void query(int i,int l, int r) {
  if((st<=l)&&(fin>=r)) {
    if(max<arb[i]) max=arb[i];
  }
  else {
    int mid=l+(r-l)/2;
    if(st<=mid) query(2*i,l,mid);
    if(fin>mid) query(2*i+1,mid+1,r);
  }
}

int main() {
  freopen("arbint.in","r",stdin);
  freopen("arbint.out","w",stdout);
  scanf("%d %d",&n,&m);
  for(i=1;i<2*n;i++) arb[i]=0;
  for(i=0;i<n;i++) {
    scanf("%d",&val);
    poz=i+1;
    update(1,1,n);
  }
  for(i=0;i<m;i++) {
    scanf("%d %d %d",&op,&a,&b);
    if(op) {
      poz=a;
      val=b;
      update(1,1,n);
    }
    else {
      max=0;
      st=a;
      fin=b;
      query(1,1,n);
      printf("%d\n",max);
    }
  }
  fclose(stdin);
  fclose(stdout);
  return 0;
}