Cod sursa(job #2018450)

Utilizator GoogalAbabei Daniel Googal Data 4 septembrie 2017 22:00:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int n, m, val, maxx;
int arbint[4 * (1 + NMAX)];

void update(int node, int le, int ri, int pos) {
  if(le == ri) {
    arbint[node] = val;
    return;
  } else {
    int mid = (le + ri) / 2;
    if(pos <= mid)
      update(2 * node, le, mid, pos);
    else
      update(2 * node + 1, mid + 1, ri, pos);

    if(arbint[2 * node] < arbint[2 * node + 1])
      arbint[node] = arbint[2 * node + 1];
    else
      arbint[node] = arbint[2 * node];
  }
}

void query(int node, int le, int ri, int a, int b) {
  if(a <= le && b >= ri) {
    if(maxx < arbint[node])
      maxx = arbint[node];
    return;
  } else {
    int mid = (le + ri) / 2;
    if(a <= mid)
      query(2 * node, le, mid, a, b);
    if(b > mid)
      query(2 * node + 1, mid + 1, ri, a, b);
  }
}

int main()
{
  in >> n >> m;
  for(int i = 1; i <= n; i++) {
    in >> val;
    update(1, 1, n, i);
  }

  for(int i = 1; i <= m; i++) {
    int p, x, y;
    in >> p >> x >> y;
    if(p == 1) {
      val = y;
      update(1, 1, n, x);
    } else {
      maxx = -1;
      query(1, 1, n, x, y);
      out << maxx << '\n';
    }
  }

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