Cod sursa(job #2222888)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 18 iulie 2018 14:17:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9 + 1;
const int MAXN = 1e5;
int seg[4 * MAXN + 1];
int v[4 * MAXN + 1];
int a, b;
void build (int st, int dr, int pos) {
  if (st == dr) {
    seg[pos] = v[st];
  }
  else {
    int mid = (st + dr) / 2;
    build (st, mid, 2 * pos);
    build (mid + 1, dr, 2 * pos + 1);
    seg[pos] = max (seg[2 * pos], seg[2 * pos + 1]);
  }
}

void update (int st, int dr, int pos) {
  if (st == dr) {
    seg[pos] = b;
  }
  else {
    int mij = (st + dr) / 2;
    if (a <= mij) {
      update (st, mij, 2 * pos);
    }
    else {
      update (mij + 1, dr, 2 * pos + 1);
    }
    seg[pos] = max (seg[2 * pos], seg[2 * pos + 1]);
  }
}

int rmq (int st, int dr, int pos) {
  if (a <= st && dr <= b) {
    return seg[pos];
  }
  else {
    if (a > dr || b < st)
      return -INF;
    else {
      int mij = (st + dr) / 2;
      return max(rmq (st, mij, 2 * pos), rmq (mij + 1, dr, 2 * pos + 1));
    }
  }
}
int main() {
  FILE *fin, *fout;
  int n, m, c, i;
  fin = fopen ("arbint.in", "r");
  fout = fopen ("arbint.out", "w");
  fscanf (fin, "%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    fscanf (fin, "%d", &v[i]);
  }
  build (1, n, 1);
  while (m--) {
    fscanf (fin, "%d%d%d", &c, &a, &b);
    if (c == 1)
      update (1, n, 1);
    else {
      fprintf (fout, "%d\n", rmq (1, n, 1));
    }
  }
  return 0;
}