Cod sursa(job #2333744)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 1 februarie 2019 21:45:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

struct Aint
{
    int a[4 * NMAX];

    void Update(int node, int left, int right, int pos, int val)
    {
        if(left == right)
        {
            a[node] = val;
            return ;
        }

        int mid = (left + right) / 2;

        if(pos <= mid)
            Update(2 * node, left, mid, pos, val);

        if(pos > mid)
            Update(2 * node + 1, mid + 1, right, pos, val);

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

    int Query(int node, int left, int right, int l, int r)
    {
        if(l <= left && right <= r)
            return a[node];

        if(l > right || r < left)
            return 0;

        int mid = (left + right) / 2;
        int ansLeft = Query(2 * node, left, mid, l, r);
        int ansRight = Query(2 * node + 1, mid + 1, right, l, r);

        return max(ansLeft, ansRight);
    }
};

int N, M;
Aint aint;

int main()
{
    int tip, 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 >> tip >> x >> y;

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

    return 0;
}