Cod sursa(job #3213434)

Utilizator tomaionutIDorando tomaionut Data 13 martie 2024 10:00:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q;
struct WizardTower
{
    vector <int> a;

    WizardTower(int n)
    {
        int sz = 1;
        while (sz < n)
            sz *= 2;
        a.resize(2 * sz);
    }

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

        if (left == right)
        {
            a[CurrentNode] = val;
            return;
        }

        int mij = (left + right) / 2, lson = 2 * CurrentNode, rson = lson + 1;
        Update(lson, left, mij, val, poz);
        Update(rson, mij + 1, right, val, poz);
        a[CurrentNode] = max(a[lson], a[rson]);
    }

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

    int Query(int CurrentNode, int left, int right, int leftQuery, int rightQuery)
    {
        if (left > rightQuery or right < leftQuery)
            return -2e9;

        if (leftQuery <= left and right <= rightQuery)
            return a[CurrentNode];

        int mij = (left + right) / 2, lson = 2 * CurrentNode, rson = lson + 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 leftQuery, int rightQuery)
    {
        return Query(1, 1, n, leftQuery, rightQuery);
    }
};

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

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


    return 0;
}