Cod sursa(job #2617743)

Utilizator stanciucalinStanciu Calin stanciucalin Data 22 mai 2020 18:30:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m;
int v[100005];

int segment_tree[400005];

int build(int node, int s, int d){

    if(s > d){

        segment_tree[node] = -1;
    }
    if(s == d){

        segment_tree[node] = v[s];
    }
    else if(s < d){

        segment_tree[node] = max(build(node * 2, s, (s + d) / 2), build(node * 2 + 1, (s + d) / 2 + 1, d));
    }

    return segment_tree[node];
}

int get_max(int node, int node_s, int node_d, int s, int d){

    if(node_s > node_d || d < node_s || node_d < s){

        return -1;
    }
    else if(s <= node_s && node_d <= d){

        return segment_tree[node];
    }
    else{

        return max(get_max(node * 2, node_s, (node_s + node_d) / 2, s, d), get_max(node * 2 + 1, (node_s + node_d) / 2 + 1, node_d, s, d));
    }
}

void update(int node, int node_s, int node_d, int x, int to_replace){

    if(node_s > node_d || x < node_s || node_d < x){

        return;
    }
    else if(node_s == x && node_s == node_d){

        segment_tree[node] = to_replace;
    }
    else{

        update(node * 2, node_s, (node_s + node_d) / 2, x, to_replace);
        update(node * 2 + 1, (node_s + node_d) / 2 + 1, node_d, x, to_replace);

        segment_tree[node] = max(segment_tree[node * 2], segment_tree[node * 2 + 1]);
    }
}

int main(){

    f>>n>>m;

    for(int i = 0; i < n; i++){

        f>>v[i];
    }

    for(int i = 0; i < 4 * n + 1; i++){

        segment_tree[i] = -1;
    }

    build(1, 0, n - 1);

    int q, a, b, x;

    for(int i = 0; i < m; i++){

        f>>q;

        if(q == 0){

            f>>a>>b;

            a -= 1;
            b -= 1;

            g<<get_max(1, 0, n - 1, a, b)<<'\n';
        }
        else{

            f>>a>>b;

            a -= 1;

            update(1, 0, n - 1, a, b);
        }
    }
    return 0;
}