Cod sursa(job #2397170)

Utilizator herbertoHerbert Mohanu herberto Data 4 aprilie 2019 11:17:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 500001

int maxarb[MAXN];
int start, finish, val, poz, maxim;
void update(int nod, int st, int dr){
  int mij;
  if(st==dr){
    maxarb[nod]=val;
    return;
  }
  mij=(st+dr)/2;
  if(poz<=mij)
    update(2*nod, st, mij);
  else
    update(2*nod+1, mij+1, dr);

  maxarb[nod]=max(maxarb[2*nod], maxarb[2*nod+1]);
}

void querry(int nod, int st, int dr){
  int mij;
  if(start<=st && dr<=finish){
    maxim=max(maxim, maxarb[nod]);
    return;
  }
  mij=(st+dr)/2;
  if(start<=mij) querry(2*nod, st, mij);
  if(mij<finish) querry(2*nod+1, mij+1, dr);
}
int main(){
  FILE*fin=fopen("arbint.in", "r");
  FILE*fout=fopen("arbint.out", "w");
  int n, m, i, x, a, b;
  fscanf(fin, "%d%d", &n, &m);
  for(i=1; i<=n; i++){
    fscanf(fin, "%d", &x);
    poz=i;
    val=x;
    update(1, 1, n);
  }
  for(i=1; i<=m; i++){
    fscanf(fin, "%d%d%d", &x, &a, &b);
    if(x==0){
      maxim=-1;
      start=a; finish=b;
      querry(1, 1, n);

      fprintf(fout, "%d\n", maxim);
    }
    else{
      poz=a; val=b;
      update(1, 1, n);
    }
  }

  return 0;
}