Cod sursa(job #3155545)

Utilizator Luka77Anastase Luca George Luka77 Data 8 octombrie 2023 16:08:45
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>
using namespace std;

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

/// STRUCTURES
struct SegmentTree
{
    vector<int>tree;

    SegmentTree(int n)
    {
        tree.resize(n + 1, 0);
    }

    inline void update(int node, int st, int dr, int pos, int val)
    {
        if(st == dr)
        {
            tree[node] = val;
        }
        else
        {
            int mid = (st + dr) / 2;

            if(pos <= mid)
                update(node * 2, st, mid, pos, val);
            else
                update(node * 2 + 1, mid + 1, dr, pos, val);
            tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
        }
    }

    inline int query(int node, int st, int dr, int tree_left, int tree_right)
    {
        if(st >= tree_left && dr <= tree_right)
        {
            return tree[node];
        }
        if(st > tree_right || dr < tree_left)
            return 0;
        
        int mid = (st + dr) / 2;

        return max(query(node * 2, st, mid, tree_left, tree_right), query(node * 2 + 1, mid + 1, dr, tree_left, tree_right));
    }
};
/////////////////////////////////////////////////////////////////////////////////////////////

/// GLOBAL VARIABLES
const int NMAX = 1e5 + 5;
int n, queries;
SegmentTree arbint(NMAX);

/////////////////////////////////////////////////////////////////////////////////////////////

/// FUNCTIONS

/////////////////////////////////////////////////////////////////////////////////////////////

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    fin >> n >> queries;

    for(int i = 1; i <= n; ++ i)
    {
        int a;
        fin >> a;
        arbint.update(1, 1, n, i, a);
    }

    while(queries--)
    {
        bool tip;
        int a, b;

        fin >> tip >> a >> b;

        if(!tip)
        {
            fout << arbint.query(1, 1, n, a, b) << '\n';
        }
        else
        {
            arbint.update(1, 1, n, a, b);
        }
    }
}