Cod sursa(job #2497125)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 22 noiembrie 2019 09:22:47
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <cstdio>
#define NMAX 100000

using namespace std;

int n, m;
int v[NMAX + 5], aint[4 * NMAX + 5];

void gen_aint(int poz, int st, int dr) {
  if(st == dr)
    aint[poz] = v[st];
  else {
    gen_aint(2 * poz, st, (st + dr) / 2);
    gen_aint(2 * poz + 1, (st + dr) / 2 + 1, dr);
    aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
  }
}

int get_max(int poz, int st, int dr, int a, int b) {
  int mij = (st + dr) / 2;

  if(dr < a || st > b)
    return 0;
  if(st >= a && dr <= b)
    return aint[poz];
  if(st >= a)
    return max(aint[2 * poz], get_max(2 * poz + 1, mij + 1, dr, a, b));
  if(dr <= b)
    return max(aint[2 * poz + 1], get_max(2 * poz, st, mij, a, b));
  return max(get_max(2 * poz, st, mij, a, b), get_max(2 * poz + 1, mij + 1, dr, a, b));
}

void update(int poz, int st, int dr, int a, int b) {
  int mij = (st + dr) / 2;

  if(st < dr) {
    if(a > mij) {
      update(2 * poz + 1, mij + 1, dr, a, b);
      aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
    }
    else {
      update(2 * poz, st, mij, a, b);
      aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
    }
  }
  else
    aint[poz] = b;
}

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

  scanf("%d %d", &n, &m);
  for(int i = 1; i <= n; i++)
    scanf("%d", &v[i]);

  gen_aint(1, 1, n);
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &op, &a, &b);
    if(op == 0)
      printf("%d\n", get_max(1, 1, n, a, b));
    else
      update(1, 1, n, a, b);
  }


  return 0;
}