Cod sursa(job #2480317)

Utilizator theo2003Theodor Negrescu theo2003 Data 25 octombrie 2019 12:09:00
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
using namespace std;
//ifstream cin("arbint.in");
//ofstream cout("arbint.out");
struct aint {
    aint *a, *b, *p;
    int v, l, r;
    aint(int x, int y, int z, aint *bb) {
        v = x;
        p = bb;
        l = y;
        r = z;
    }
    aint(){}
};
aint root;
int ls[100001];
aint *leaf[100001];
int build(aint &node, int l, int r){
    if(l != r){
        node.a = new aint(0, l, l + (r - l + 1)/2 - 1, &node);
        node.b = new aint(0, l + (r - l + 1)/2, r, &node);
        node.v = max(build(*node.a, node.a->l, node.a->r), build(*node.b, node.b->l, node.b->r));
        return node.v;
    }else{
        node.v = ls[l];
        leaf[l] = &node;
        return node.v;
    }
}
int getmax(aint &node, int l, int r){
    if((r < node.l) || (l > node.r))
        return 0;
    else if((l == node.l) && (r == node.r))
        return node.v;
    else if(r <= node.a->r)
        return getmax(*node.a, l, r);
    else if(l >= node.b->l)
        return getmax(*node.b, l, r);
    else return max(getmax(*node.a, l, node.a->r), getmax(*node.b, node.b->l, r));
}
void update(aint *node, int change){
    node->v = change;
    node = node->p;
    while(true){
        node->v = max(node->a->v, node->b->v);
        if(node->p == NULL)
            break;
        node = node->p;
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin>>n>>m;
    for(int x = 1;x<=n;x++){
        cin>>ls[x];
    }
    root = aint(0, 1, n, NULL);
    build(root, 1, n);
    for(int x = 1;x<=m;x++){
        int r, a, b;
        cin>>r>>a>>b;
        if(r == 0){
            cout<<getmax(root, a, b)<<'\n';
        }else update(leaf[a], b);
    }
    return 0;
}