Cod sursa(job #2157752)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 9 martie 2018 21:25:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
 
#define NMAX 100005
#define SQRTMAX 360

struct {
  int inc, sf;
}b[SQRTMAX];
int n, m, _sqrt, nb, a[NMAX], value[SQRTMAX];
 
#define which(i) (ceil(1.0 * i / _sqrt))

void init() {
  _sqrt = sqrt(n);
  nb = which(n);
 
  b[1].inc = 1;
  b[1].sf = _sqrt;
 
  for (int i = 2; i <= nb; i++) {
    b[i].inc = b[i - 1].sf + 1;
    b[i].sf = b[i].inc + _sqrt - 1;
    value[i] = 0;
  }
 
  b[nb].sf = min(b[nb].sf, n);
}
 
void citire() {
  for (int i = 1; i <= n; i++) {
    scanf("%d ", &a[i]);
    const int k = which(i);
    value[k] = max(value[k], a[i]);
  }
}
 
int runQuery(int st, int dr) {
  const int bSt = which(st), bDr = which(dr);
  int query = 0;
 
  if (bSt == bDr) {
    return (st == b[bSt].inc && dr == b[bDr].sf) ? \
		value[bSt] : *max_element(a + st, a + dr + 1);
  }
 
  if (st > b[bSt].inc) {
    for (int i = st; i <= b[bSt].sf; i++)
      query = max(query, a[i]);
  } else if (st == b[bSt].inc) {
    query = max(query, value[bSt]);
  }
 
  for (int i = bSt + 1; i < bDr; i++) {
    query = max(query, value[i]);
  }

  if (dr < b[bDr].sf) {
    query = max(query, *max_element(a + b[bDr].inc, a + dr + 1));
  } else if (dr == b[bDr].sf) {
    query = max(query, value[bDr]);
  }
 
  return query;
}
 
void runUpdate(int pos, int val) {
  a[pos] = val;
  const int k = which(pos);
  if (val > value[k]) value[k] = val;
  else value[k] = *max_element(a + b[k].inc, a + b[k].sf + 1);
}
 
void rezolvare() {
  for (int i = 1; i <= m; i++) {
    int tip, a, b;
    scanf("%d %d %d ", &tip, &a, &b);
 
    if (tip == 1)
      runUpdate(a, b);
    else
      printf("%d\n", runQuery(a, b));
  }
 
}
 
int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
 
  scanf("%d %d ", &n, &m);
 
  init();
  citire();
  rezolvare();
 
  return 0;
}