Cod sursa(job #2650830)

Utilizator madalin_frFrincu Madalin madalin_fr Data 20 septembrie 2020 13:24:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
#define NMAX 100010
int N, M;
int arb[4 * NMAX], Max_Interv;

void Update(int nod, int st, int dr, int poz, int val) {
  if (st == dr)
    arb[nod] = val;
  else {
    int mij = (st + dr) / 2;
    if (poz <= mij)
      Update(2 * nod, st, mij, poz, val);
    else
      Update(2 * nod + 1, mij + 1, dr, poz, val);
    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
  }
}

void Query(int nod, int st, int dr,
  const int & start,
    const int & finish) {
  if (start <= st && finish >= dr) {
    Max_Interv = max(Max_Interv, arb[nod]);
    return;
  } else {
    int mij = (st + dr) / 2;
    if (start <= mij)
      Query(2 * nod, st, mij, start, finish);
    if (finish >= mij + 1)
      Query(2 * nod + 1, mij + 1, dr, start, finish);
  }
}

int main() {
  f >> N >> M;
  for (int i = 1; i <= N; i++) {
    int X;
    f >> X;
    Update(1, 1, N, i, X);
  }
  for (int i = 1; i <= M; i++) {
    int op, x, y;
    f >> op >> x >> y;
    if (op == 0) {
      Max_Interv = 0;
      Query(1, 1, N, x, y);
      g << Max_Interv << "\n";
    }
    if (op == 1) {
      Update(1, 1, N, x, y);
    }
  }
  f.close();
  g.close();
  return 0;
}