Cod sursa(job #2201084)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 3 mai 2018 15:45:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int N, M, x, cer, p1, p2, arb[4 * 100003];
void update(int poz, int val, int nod, int st, int dr)
{
    if(st == dr) {
        arb[nod] = val;
    }
    else {
        int mid = (st + dr) / 2;
        if(poz <= mid)
            update(poz, val, nod * 2, st, mid);
        else
            update(poz, val, nod * 2 + 1, mid + 1, dr);
        arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
    }
}

int query(int a, int b, int nod, int st, int dr)
{
    int partea_stanga = 0, partea_dreapta = 0;
    if(a <= st && b >= dr)
        return arb[nod];
    else {
        int mid = (st + dr) / 2;
        if(a <= mid)
            partea_stanga = query(a, b, 2 * nod, st, mid);
        if(b > mid)
            partea_dreapta = query(a, b, 2 * nod + 1, mid + 1, dr);
        return max(partea_stanga, partea_dreapta);
    }
}
int main()
{
    f >> N >> M;
    for(int i = 1; i <= N; i++)
        f >> x, update(i, x, 1, 1, N);
    for(int i = 1; i <= M; i++) {
        f >> cer >> p1 >> p2;
        if(cer == 1) update(p1, p2, 1, 1, N);
        else g << query(p1, p2, 1, 1, N) << "\n";
    }
    return 0;
}