Cod sursa(job #2699517)

Utilizator Afanasiuc_DanielDaniel Afanasiuc Afanasiuc_Daniel Data 24 ianuarie 2021 19:35:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define dim (int)1e4 + 1
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int Arbore[400005];

void Update(int nod, int left, int right, int nr, int pozitie)
{
    if (left == right)
    {
        Arbore[nod] = nr;
        return;
    }
    int mid = (left + right) / 2;
    if (pozitie <= mid)
        Update(2 * nod, left, mid, nr, pozitie);
    else
        Update(2 * nod + 1, mid + 1, right, nr, pozitie);
    Arbore[nod] = max(Arbore[2 * nod], Arbore[2 * nod + 1]);
}
int Query(int nod, int start, int end, int l, int r)
{
    if (r<start || l>end)
        return 0;
    if (l <= start && end <= r)
        return Arbore[nod];
    int mid = (start + end) / 2;
    int p1 = Query(2 * nod, start, mid, l, r);
    int p2 = Query(2 * nod + 1, mid + 1, end, l, r);
    return max(p1, p2);
}
int main() 
{
    int M, N;
    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        int x;
        fin >> x;
        Update(1, 1, N, x, i);
    }
    for (int i = 1; i <= M; ++i)
    {
        int x, a, b;
        fin >> x >> a >> b;
        if (x == 1)
            Update(1, 1, N, b, a);
        else
            fout<<Query(1, 1, N, a, b)<<'\n';
    }
}