Cod sursa(job #2883262)

Utilizator tomaionutIDorando tomaionut Data 1 aprilie 2022 12:57:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
struct WizardTower
{
    vector <int> aint;
    WizardTower(int n)
    {
        int sz = 1;
        while (sz < n)
            sz *= 2;
        aint.resize(2 * sz);
    }

    void Update(int currentNode, int left, int right, int poz, int x)
    {
        if (right < poz or left > poz)
            return;

        if (left == right)
        {
            aint[currentNode] = x;
            return;
        }

        int mij = (left + right) / 2;
        int lson = 2 * currentNode, rson = 2 * currentNode + 1;
        Update(lson, left, mij, poz, x);
        Update(rson, mij + 1, right, poz, x);
        aint[currentNode] = max(aint[lson], aint[rson]);
    }

    void Update(int poz, int x)
    {
        Update(1, 1, n, poz, x);
    }

    int Query(int currentNode, int left, int right, int leftQuery, int rightQuery)
    {      
        if (rightQuery < left or leftQuery > right)
            return 0;

        if (left >= leftQuery and right <= rightQuery)
            return aint[currentNode];

        int mij = (left + right) / 2;
        int lson = 2 * currentNode, rson = 2 * currentNode + 1;
        int x1 = Query(lson, left, mij, leftQuery, rightQuery );
        int x2 = Query(rson, mij + 1, right, leftQuery, rightQuery);
        return max(x1, x2);
    }

    int Query(int x, int y)
    {
        return Query(1, 1, n, x, y);
    }
};

int main() 
{
    int i, x, y, op;
    fin >> n >> m;
    WizardTower tree(n);
    for (i = 1; i <= n; i++)
    {
        fin >> x;
        tree.Update(i, x);
    }

    while (m--)
    {
        fin >> op >> x >> y;
        if (op == 1)
            tree.Update(x, y);
        else
            fout << tree.Query(x, y) << "\n";
    }



    return 0;
}