Cod sursa(job #2987828)

Utilizator NarcisMMic Narcis NarcisM Data 2 martie 2023 22:01:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q, v[100001], ai[400001], t;
void build(int x, int st, int dr){
    if(st == dr)
        ai[x] = v[st];
    else{
        int mid = (st + dr) / 2;
        build(x * 2, st, mid);
        build(x * 2 + 1, mid + 1, dr);
        ai[x] = max(ai[x * 2], ai[x * 2 + 1]);
    }
}
void update(int x, int st, int dr, int pos, int val){
    if(st == dr)
        ai[x] = val;
    else{
        int mid = (st + dr) / 2;
        if(pos <= mid)
            update(x * 2, st, mid, pos, val);
        else
            update(x * 2 + 1, mid + 1, dr, pos, val);
        ai[x] = max(ai[x * 2], ai[x * 2 + 1]);
    }
}
int query(int x, int st, int dr, int qst, int qdr){
    if(qst <= st && dr <= qdr)
        return ai[x];
    else{
        int mid = (st + dr) / 2;
        if(qdr <= mid)
            return query(x * 2, st, mid, qst, qdr);
        if(mid + 1 <= qst)
            return query(x * 2 + 1, mid + 1, dr, qst, qdr);
        return max(query(x * 2, st, mid, qst, qdr), query(x * 2 + 1, mid + 1, dr, qst, qdr));
    }
}
int main() {
    fin >> n >> q;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    build(1, 1, n);
    while(q--){
        fin >> t;
        if(t == 0){
            int st, dr;
            fin >> st >> dr;
            fout << query(1, 1, n, st, dr) << '\n';
        }else{
            int pos, x;
            fin >> pos >> x;
            update(1, 1, n, pos, x);
        }
    }
    return 0;
}