Cod sursa(job #2486814)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 3 noiembrie 2019 15:19:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define N_MAX 100001
using namespace std;

int N, M, arbint[4 * N_MAX];

void update(int val, int pos, int st = 1, int dr = N, int nod = 1)
{
    if(st == dr)
    {
        arbint[nod] = val;
        return;
    }

    int mid = (st + dr)/2;

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

    arbint[nod] = max(arbint[2*nod], arbint[2*nod + 1]);
}

int query(int a, int b, int st = 1, int dr = N, int nod = 1)
{
    if(a <= st && dr <= b)
        return arbint[nod];

    int mid = (st + dr)/2, MAX = -1;

    if(a <= mid)
        MAX = max(MAX, query(a, b, st, mid, 2*nod));

    if(b > mid)
        MAX = max(MAX, query(a, b, mid + 1, dr, 2*nod + 1));

    return MAX;
}

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

    fin >> N >> M;

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


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

        if(c & 1) update(b, a);
        else fout << query(a, b) << '\n';
    }
}