Cod sursa(job #2418964)

Utilizator pickleVictor Andrei pickle Data 7 mai 2019 07:15:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < n; i++)
#define repa(i, l, r) for (int i = l; i < r; i++)
#define repd(i, r, l) for (int i = r; i > l; i--)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

const int Nmax = 100555;
int N, M, Arb[3*Nmax];

void update(int nod, int l, int r, int pos, int val);
int query(int nod, int l, int r, int a, int b);

int main(void) {
  int x,q,a,b;
  fin >> N >> M;
  rep(i, N) {
    fin >> x;
    update(1, 1, N, i+1, x);
  }

  rep(i, M) {
    fin >> q >> a >> b;
    if (q == 0) {
      fout << query(1, 1, N, a, b) << '\n';
    } else if (q == 1) {
      update(1, 1, N, a, b);
    }
  }

  return 0;
}

void update(int nod, int l, int r, int pos, int val) {
  if (l == r) {
    Arb[nod] = val;
    return;
  }
  int mid = l + (r - l)/2;
  if (pos <= mid) {
    update(2*nod, l, mid, pos, val);
  } else {
    update(2*nod+1, mid+1, r, pos, val);
  }
  Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
}

int query(int nod, int l, int r, int a, int b) {
  if (a <= l && r <= b) {
    return Arb[nod];
  }
  int mid = l + (r - l)/2;

  if (b < mid+1) {
    return query(2*nod, l, mid, a, b);
  } else if (a > mid) {
    return query(2*nod+1, mid+1, r, a, b);
  } else {
    return max(
            query(2*nod, l, mid, a, b),
            query(2*nod+1, mid+1, r, a, b)
           );
  }
}