Cod sursa(job #2636072)

Utilizator abcabc123abc abc abcabc123 Data 16 iulie 2020 15:15:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int n, m, a[100001], ma[400001], c, p, v, s, d;

void build (int poz, int st, int dr) {
  if (st == dr) {
    ma[poz] = a[st];
    return;
  }
  int mij = (st + dr) / 2;
  build (poz * 2, st, mij);
  build (poz * 2 + 1, mij + 1, dr);
  ma[poz] = max (ma[poz * 2], ma[poz * 2 + 1]);
}

void update (int poz, int st, int dr) {
  if (st == dr) {
    ma[poz] = v;
    return;
  }
  int mij = (st + dr) / 2;
  if (p <= mij)
    update (poz * 2, st, mij);
  else
    update (poz * 2 + 1, mij + 1, dr);
  ma[poz] = max (ma[poz * 2], ma[poz * 2 + 1]);
}

int query (int poz, int st, int dr) {
  if (st > d or s > dr)
    return 0;
  if (s <= st and dr <= d)
    return ma[poz];
  int mij = (st + dr) / 2;
  int s1 = query (poz * 2, st, mij);
  int s2 = query (poz * 2 + 1, mij + 1, dr);
  return max (s1, s2);
}

int main()
{
  fin >> n >> m;
  for (int i = 1; i <= n; i++)
    fin >> a[i];
  build (1, 1, n);
  while (m--) {
    fin >> c;
    if (c == 0) {
      fin >> s >> d;
      fout << query (1, 1, n) << '\n';
    }
    else {
      fin >> p >> v;
      update (1, 1, n);
    }
  }
  return 0;
}