Cod sursa(job #2917524)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 5 august 2022 15:12:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

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

const int MAX_N = 100005;
int n, input[MAX_N];
struct SEGTREE{
    int aint[4 * MAX_N];

    inline void build(int nod, int st, int dr){
        int md = st + ((dr - st) >> 1);
        if(st == dr){
            aint[nod] = input[md];
            return;
        }

        build(2*nod  , st  , md);
        build(2*nod+1, md+1, dr);
        aint[nod] = max(aint[2*nod], aint[2*nod+1]);
    }

    inline void update(int nod, int st, int dr, int index, int new_val){
        int md = st + ((dr - st) >> 1);
        if(st == dr){
            aint[nod] = new_val;
            return;
        }

        if(index <= md)
            update(2*nod  , st  , md, index, new_val);
        else
            update(2*nod+1, md+1, dr, index, new_val);
        aint[nod] = max(aint[2*nod], aint[2*nod+1]);
    }

    int sol;
    inline void query(int nod, int st, int dr, int lft, int rgt){
        if(lft <= st && dr <= rgt){
            sol = max(sol, aint[nod]);
            return;
        }
        int md = st + ((dr - st) >> 1);
        if(lft <= md) query(2*nod  , st  , md, lft, rgt);
        if(rgt >  md) query(2*nod+1, md+1, dr, lft, rgt);
    }
} tree;

const int MAX_Q = 100005;
int qcnt, type, a, b;

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n>>qcnt;
    for(int i=1; i<=n; i++)
        fin>>input[i];
    tree.build(1, 1, n);

    while(qcnt--){
        fin>>type>>a>>b;
        if(type == 0){ ///query
            tree.sol = 0;
            tree.query(1, 1, n, a, b);
            fout<<tree.sol<<"\n";
        }else{ ///update
            tree.update(1, 1, n, a, b);
        }
    }
    return 0;
}