Cod sursa(job #2384480)

Utilizator Iulia25Hosu Iulia Iulia25 Data 20 martie 2019 19:52:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;

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

int n, m, start;
int a[400005];

int idk(int y)  {
  int x = 1;
  while (x < y)
    x <<= 1;
  return x;
}

void Update(int nod)  {
  a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
  if (nod == 1)
    return;
  Update(nod / 2);
}

int Query(int nod, int st, int dr, int x, int y)  {
  int ans = 0, k = 0;
  if (x <= st && y >= dr)
    return a[nod];
  int mij = (st + dr) / 2;
  if (x <= mij)  {
    k = Query(2 * nod, st, mij, x, y);
    ans = max(k, ans);
  }
  if (y > mij)  {
    k = Query(2 * nod + 1, mij + 1, dr, x, y);
    ans = max(k, ans);
  }
  return ans;
}

int main()  {
  fin >> n >> m;
  start = idk(n);
  int x, y, c = 0;
  for (int i = 0; i < n; ++i)  {
    fin >> a[start + i];
    Update((start + i) / 2);
  }
  for (int i = 1; i <= m; ++i)  {
    fin >> c >> x >> y;
    if (c == 0)
      fout << Query(1, 1, start, x, y) << '\n';
    else  {
      a[start + x - 1] = y;
      Update((start + x - 1) / 2);
    }
  }
}