Cod sursa(job #2223443)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 20 iulie 2018 12:42:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

const int NMAX = 100005;
int aint[4 * NMAX];

void update(int val, int pos, int node,int left, int right) {
    if(left == right)
        aint[node] = val;
    else {
        int mid = (left + right) / 2;
        if(pos <= mid)
            update(val, pos, node * 2, left, mid);
        else
            update(val, pos, node * 2 + 1, mid + 1, right);
        aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
    }
}

int query(int from, int to, int node, int left, int right) {
    if(from <= left && right <= to)
        return aint[node];
    else {
        int mid = (left + right) / 2, maxim = 0;
        if(from <= mid)
            maxim = query(from, to, node * 2, left, mid);
        if(mid < to)
            maxim = max(maxim, query(from, to, node * 2 + 1, mid + 1, right));
        return maxim;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    in.tie(0);
    out.tie(0);
    int n, m;
    in >> n >> m;
    for(int i = 1; i <= n; i ++) {
        int x;
        in >> x;
        update(x, i, 1, 1, n);
    }
    for(int i = 1; i <= m; i ++) {
        int test, a, b;
        in >> test >> a >> b;
        if(test == 0)
            out << query(a, b, 1, 1, n) << "\n";
        else
            update(b, a, 1, 1, n);
    }
    return 0;
}