Cod sursa(job #2671351)

Utilizator alexia208160Popescu Alexia Maria alexia208160 Data 11 noiembrie 2020 22:35:23
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int v[NMAX + 5];

struct Aint
{
    int a[4 * NMAX];
    void Build(int first, int last, int node)
    {
        if(first == last)
        {
            a[node] = v[first];
            return;
        }

        int mid = (first + last) / 2;
        Build(first, mid, 2 * node);
        Build(mid + 1, last, 2 * node + 1);

        a[node] = max(a[2 * node], a[2 * node + 1]);
    }

    void Update(int first, int last, int node, int val, int x)
    {
        if(first == last)
        {
            a[node] = x;
            return;
        }

        int mid = (first + last) / 2;
        if(mid < val)
            Update(mid + 1, last, node * 2 + 1, val, x);
        else
            Update(first, mid, node * 2, val ,x);

        a[node] = max(a[node * 2], a[node * 2 + 1]);
    }

    int Query(int node, int first, int last, int left, int right)
    {
        if(first >= left && last <= right)
            return a[node];
        if(first > right || last < left)
            return 0;

        int mid = (first + last) / 2;

        return max(Query(2 * node, first, mid, left, right), Query(2 * node + 1, mid + 1, last, left, right));
    }

};

Aint Arb;

int main()
{
    int n, m, q, x, y;
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];

    Arb.Build(1, n, 1);
    /*for(int i = 1; i <= n; i++)
        fout << Arb.a[i] <<' ' ;
    fout << '\n';*/
    for(int i = 0; i < m; i++)
    {
        fin >> q >> x >> y;
        if(q == 1)
            Arb.Update(1, n, 1, x, y);
        else
            fout << Arb.Query(1, 1, n, x, y) << ' ' ;
    }
    return 0;
}