Cod sursa(job #2136415)

Utilizator GoogalAbabei Daniel Googal Data 19 februarie 2018 21:51:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 1e5;

int n, m, ans;
int a[1 + NMAX];
int aint[1 + 4 * NMAX];

void add(int node, int pos, int le, int ri, int v) {
  int mid = (le + ri) / 2;

  if(le == ri && le == pos) {
    aint[node] = v;
  } else {
    if(pos <= mid)
      add(2 * node, pos, le, mid, v);
    else
      add(2 * node + 1, pos, mid + 1, ri, v);
    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
  }
}

void query(int node, int le, int ri, int fr, int to) {
  int mid = (fr + to)/2;
  if(fr >= le && to <= ri) {
    ans = max(ans, aint[node]);
    return;
  }

  if (le > to || ri < fr)
    return;

  query(node * 2, le, ri, fr, mid);
  query(node * 2 + 1, le, ri, mid + 1, to);
}

int main()
{
  in >> n >> m;
  for(int i = 1; i <= n; i++) {
    in >> a[i];
    add(1, i, 1, n, a[i]);
  }

  for(int i = 1; i <= m; i++) {
    int op, x, y;
    in >> op >> x >> y;

    if(op == 1)
      add(1, x, 1, n, y);
    else {
      ans = 0;
      query(1, x, y, 1, n);
      out << ans << '\n';
    }
  }

  in.close();
  out.close();
  return 0;
}