Cod sursa(job #2482385)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 28 octombrie 2019 10:46:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
int arb[400006];

void update(int st, int dr, int nod, int val, int poz){
    if(st == dr){
        arb[nod] = val;
    } else {
        int m = (st + dr) / 2;

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

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

void query(int st, int dr, int start, int finish, int nod, int &mx){
    if(start <= st && dr <= finish){
        mx = max(arb[nod], mx);
        return;
    } else {
        int m = (st + dr) / 2;

        if(start <= m)
            query(st, m, start, finish, 2 * nod, mx);
        if(m < finish)
            query(m + 1, dr, start, finish, 2 * nod + 1, mx);
    }
}

int main()
{
    int i, x, a, b;

    f >> n >> m;

    for(i = 1; i <= n; ++i){
        f >> x;
        update(1, n, 1, x, i);
    }

    for(i = 1; i <= m; ++i){
        f >> x >> a >> b;

        if(x == 0){
            int mx = 0;
            query(1, n, a, b, 1, mx);
            g << mx << '\n';
        } else {
            update(1, n, 1, b, a);
        }
    }

    return 0;
}