Cod sursa(job #2719775)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 10 martie 2021 11:59:33
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMax = 1e5, oo = 0x3f3f3f3f;

int n, m, x;
int aint[4 * NMax + 5];

void Update(int node, int left, int right, int pos, int value){
    if (left == right){
        aint[node] = value;
        return;
    }
    int mid = (left + right) >> 1;
    int leftson = 2 * node, rightson = leftson + 1;
    if (pos <= mid)
        Update(leftson, left, mid, pos, value);
    else
        Update(rightson, mid + 1, right, pos, value);
    aint[node] = max(aint[leftson], aint[rightson]);
}

void Read(){
    fin >> n >> m;
    for (int i = 1; i <= n; i++){
        fin >> x;
        Update(1, 1, n, i, x);
    }
}

int Query(int node, int left, int right, int leftquery, int rightquery){
    if (left == right)
        return aint[node];
    int mid = (left + right) >> 1;
    int leftson = 2 * node, rightson = leftson + 1;
    int ans = -oo;
    if (mid >= leftquery)
        ans = max(ans, Query(leftson, left, mid, leftquery, rightquery));
    if (mid + 1 <= rightquery)
        ans = max(ans, Query(rightson, mid + 1, right, leftquery, rightquery));
    return ans;
}

int main(){
    Read();
    while (m--){
        int type, a, b;
        fin >> type >> a >> b;
        if (type == 0)
            fout << Query(1, 1, n, a, b) << '\n';
        if (type == 1)
            Update(1, 1, n, a, b);
    }
    return 0;
}