Cod sursa(job #2279080)

Utilizator palomaPaloma Josse paloma Data 8 noiembrie 2018 21:35:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxn = 1e5;

int n, v[maxn + 1], tree[maxn * 4 + 1];

void dfs(int node, int left, int right) {
  if (left == right) {
    tree[ node ] = v[ left ];
    return;
  }
  int middle = (left + right)/2;
  dfs(node * 2, left, middle);
  dfs(node * 2 + 1, middle + 1, right);

  tree[ node ] = max(tree[node * 2], tree[node * 2 + 1]);
}

int query(int node, int left, int right, int x, int y) {
  if (left >= x && right <= y) {
    return tree[ node ];
  }
  int q1 = 0, q2 = 0, middle = (left + right)/2;
  if (x <= middle) {
    q1 = query(node*2, left, middle, x, y);
  }
  if (y > middle) {
    q2 = query(node*2 + 1, middle+1, right, x, y);
  }

  return max(q1, q2);
}

void update(int node, int left, int right, int x, int y) {
  if (left == right) {
    tree[ node ] = y;
    return;
  }
  int middle = (left + right)/2;
  if (x <= middle) {
    update(node*2, left, middle, x, y);
  }
  else {
    update(node*2 + 1, middle + 1, right, x, y);
  }

  tree[ node ] = max(tree[node*2], tree[node*2+1]);
}

int main()
{
  int q, a, b, o;

  fi >> n >> q;
  for (int i = 1; i <= n; i++) {
    fi >> v[ i ];
  }

  dfs(1, 1, n);

  while (q--) {
    fi >> o >> a >> b;
    if (o == 0) {
      fo << query(1, 1, n, a, b) << '\n';
    }
    else {
      update(1, 1, n, a, b);
    }
  }

  fi.close();
  fo.close();

  return 0;
}