Cod sursa(job #2367370)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 5 martie 2019 10:25:11
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <climits>

using namespace std;

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

const int NMAX = 100000 + 5;

int N, M;

struct Aint
{
    int v[NMAX];

    void Update(int node, int st, int dr, int pos, int val)
    {
        if(st == dr)
        {
            v[node] = val;
            return ;
        }

        int mid = (st + dr) / 2;

        if(pos <= mid)
            Update(2 * node, st, mid, pos, val);
        else
            Update(2 * node + 1, mid + 1, dr, pos, val);

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

    int Query(int node, int st, int dr, int l, int r)
    {
        if(l <= st && dr <= r)
            return v[node];

        if(l > dr || r < st)
            return INT_MIN;

        int mid = (st + dr) / 2;

        if(r <= mid)
            return Query(2 * node, st, mid, l, r);
        else if(l >= mid + 1)
            return Query(2 * node + 1, mid + 1, dr, l, r);
        else
            return max(Query(2 * node, st, mid, l, r), Query(2 * node + 1, mid + 1, dr, l, r));
    }
};

Aint aint;

int main()
{
    int type, a, b;

    fin >> N >> M;

    for(int i = 1; i <= N; i++)
    {
        fin >> a;
        aint.Update(1, 1, N, i, a);
    }

    for(int i = 1; i <= M; i++)
    {
        fin >> type >> a >> b;

        if(type == 1)
            aint.Update(1, 1, N, a, b);
        else
            fout << aint.Query(1, 1, N, a, b) << '\n';
    }

    return 0;
}