Cod sursa(job #3162213)

Utilizator alexandru_ioan.06Alexandru Ioan alexandru_ioan.06 Data 28 octombrie 2023 16:33:30
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

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

const int maxDim = 1e5 + 5;

int seg_tree[2 * maxDim] , a[maxDim] , n , q;

struct SegTree
{
    void Build ()
    {
        for(int i = 0 ; i < n ; ++i)
            seg_tree[i + n] = a[i];
        for(int i = n - 1 ; i > 0 ; --i)
            seg_tree[i] = max(seg_tree[i << 1] , seg_tree[i << 1 | 1]);
    }

    void Update (int p , int t)
    {
        p += n;
        seg_tree[p] = t;
        for(int i = p ; i > 1 ; i >>= 1)
            seg_tree[i >> 1] = max(seg_tree[i] , seg_tree[i ^ 1]);
    }

    int Query (int l , int r)
    {
        int ans = 0;
        l += n , r += n;

        while(l < r)
        {
            if(l & 1)
                ans = max(ans , seg_tree[l++]);
            if(r & 1)
                ans = max(ans , seg_tree[--r]);
            l >>= 1 , r >>= 1;
        }

        return ans;
    }
}T;

int main()
{
    fin >> n >> q;
    for(int i = 0 ; i < n ; ++i)
        fin >> a[i];
    T.Build();
    while(q --)
    {
        int t , a , b;
        fin >> t >> a >> b;
        if(t == 0)
            fout << T.Query(a - 1 , b) << '\n';
        else
            T.Update(a - 1 , b);
    }
}