Cod sursa(job #2445030)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 2 august 2019 12:05:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;

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

const int NMAX = 1e5;

int N, M;

struct arbint
{

    int v[4 * NMAX];

    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] = Merge(v[2 * node], v[2 * node + 1]);
    }

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

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

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

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

    int Merge(int a, int b)
    {
        return max(a, b);
    }

};

arbint aint;

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= N; i++)
    {

        int x;
        fin >> x;
        aint.Update(1, 1, N, i, x);

    }

    for(int i = 1; i <= M; i++)
    {

        int t, a, b;
        fin >> t >> a >> b;

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

    return 0;
}