Cod sursa(job #2416119)

Utilizator GoogalAbabei Daniel Googal Data 26 aprilie 2019 22:00:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 1e5;

int n, m;
int res;

int v[1 + NMAX];
int aint[1 + 4 * NMAX];

void add(int node, int pos, int le, int ri, int v)
{
    int mid = (le + ri) / 2;

    if(le == ri && mid == pos)
    {
        aint[node] = v;
    }
    else
    {
        if(pos <= mid)
            add(2 * node, pos, le, mid, v);
        else
            add(2 * node + 1, pos, mid + 1, ri, v);

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

void query(int node, int le, int ri, int fr, int to)
{
    int mid = (fr + to) / 2;

    if(le <= fr && to <= ri)
    {
        res = max(res, aint[node]);
        return;
    }

    if(le > to || ri < fr)
        return;

    query(2 * node, le, ri, fr, mid);
    query(2 * node + 1, le, ri, mid + 1, to);
}

int main()
{
    in >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        in >> v[i];
        add(1, i, 1, n, v[i]);
    }

    for(int i = 1; i <= m; i++)
    {
        int code, x, y;

        in >> code >> x >> y;

        if(code == 1)
        {
            add(1, x, 1, n, y);
        }
        else
        {
            res = 0;
            query(1, x, y, 1, n);

            out << res << '\n';
        }
    }

    in.close();
    out.close();

    return 0;
}