Cod sursa(job #2719778)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 10 martie 2021 12:03:53
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 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;
int v[NMax + 5], aint[4 * NMax + 5];

void Read(){
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
}

void Build(int node, int left, int right){
    if (left == right){
        aint[node] = v[left];
        return;
    }
    int mid = (left + right) >> 1;
    int leftson = 2 * node, rightson = leftson + 1;
    Build(leftson, left, mid);
    Build(rightson, mid + 1, right);
    aint[node] = max(aint[leftson], aint[rightson]);
}

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]);
}

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();
    Build(1, 1, n);
    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;
}