Cod sursa(job #2415632)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 26 aprilie 2019 13:00:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

struct Aint
{
    int v[4 * NMAX + 5];

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

        int mid = (l + r) >> 1;

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

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

    int Query(int node, int l, int r, int st, int dr)
    {
        if(dr < l || st > r)
            return 0;

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

        int mid = (l + r) >> 1;

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

Aint aint;
int N, M;

int main()
{
    int t, x, y;

    fin >> N >> M;

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

    for(int i = 1; i <= M; i++)
    {
        fin >> t >> x >> y;

        if(t == 0)
            fout << aint.Query(1, 1, N, x, y) << '\n';
        else
            aint.Update(1, 1, N, x, y);
    }

    return 0;
}