Cod sursa(job #2381197)

Utilizator AndoneAlexandruAndone Alexandru AndoneAlexandru Data 16 martie 2019 11:17:58
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int n, m;
int arr[NMAX];
int tree[4*NMAX];

void build(int st, int dr, int x) {
    if (st == dr) {
        tree[x] = arr[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(st, mij, 2 * x);
    build(mij+1, dr, 2 * x +1);
    tree[x] = max(tree[2*x], tree[2*x+1]);
}

void update(int st, int dr, int x, int poz, int e) {
    if (st == dr) {
        tree[x] = e;
        return;
    }
    int mij = (st + dr) / 2;
    if (poz <= mij)
        update(st, mij, 2*x, poz, e);
    else update(mij+1, dr, 2*x+1, poz, e);
    
    tree[x] = max(tree[2*x], tree[2*x+1]);
}

int maxim(int st, int dr, int x, int a, int b) {
    if (st == a && dr == b)
        return tree[x];
    if (dr < a || st > b)
        return -1;
    int mij = (st + dr) / 2;
    return max(maxim(st, mij, 2*x, a, mij), maxim(mij+1, dr, 2*x+1, mij+1, b));
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; ++i)
        in >> arr[i];
    build(1, n, 1);
    //out << tree[1];
    
    
    while (m) {
        int p;
        in >> p;
        if (p == 0) {
            int a, b;
            in >> a >> b;
            out << maxim(1, n, 1, a, b) << '\n';
        }
        else {
            int poz, e;
            in >> poz >> e;
            update(1, n, 1, poz, e);/*
            for (int i = 0; i < 4*n; ++i)
                out << tree[i] << ' ';
            out << '\n';*/
        }
        m--;
    }/*
    for (int i = 0; i < 4*n; ++i)
        out << tree[i] << ' ';*/
        
    return 0;
}