Cod sursa(job #1778660)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 octombrie 2016 22:57:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int N = 1e5;
int n;
int t[2 * N];

void build() {
    for (int i = n - 1; i > 0; -- i)
        t[i] = max(t[i << 1], t[i << 1 | 1]);
}

void update(int p, int value) {
    for (t[p += n] = value; p > 1; p >>= 1)
        t[p>>1] = max(t[p], t[p^1]);
}

int query(int l, int r) {
  int res = 0;
  for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
    if (l & 1)
        res = max(res, t[l ++ ]);
    if (r & 1)
        res = max(res, t[-- r]);
  }
  return res;
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    int m = 0;
    cin >> n >> m;

    for (int i = 0; i < n; ++ i)
        cin >> t[n + i];
    build();

    bool type;
    int a, b;
    while (m --) {
        cin >> type >> a >> b;
        if (!type)
            cout << query(a - 1, b) << '\n';
        else
            update(a - 1, b);
    }

    cin.close();
    cout.close();
    return 0;
}