Cod sursa(job #2738830)

Utilizator grezdeCristian Ardeleanu grezde Data 6 aprilie 2021 13:44:28
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <algorithm>

using namespace std;

//*
ifstream  cin("arbint.in");
ofstream cout("arbint.out");
// */

const int MAXPN = 16384;
int n, m, pn;
int a[2*MAXPN+2];

int query(int st, int dr, int i, int start, int end) {
    int fl = (start+end)/2;
    if(start == end)
        return a[i];
    if(st < start && dr > end)
        return a[i];
    if(st > fl)
        return query(st, dr, 2*i+1, fl+1, end);
    if(dr <= fl)
        return query(st, dr, 2*i, start, fl);
    return max(query(st, dr, 2*i+1, fl+1, end), query(st, dr, 2*i, start, fl));
}

void update(int i, int b) {
    a[i] = b;
    for(i/=2; i>0; i/=2)
        a[i] = max(a[2*i], a[2*i+1]);
}

int main()
{   
    cin >> n >> m;
    int aux=n;
    pn = 1;
    while(aux > 0) {
        aux >>= 1;
        pn <<= 1;
    }
    if(pn == n*2)
        pn = n;
    for(int i=pn; i<pn+n; i++)
        cin >> a[i];
    for(int i=pn-1; i>0; i--)
        a[i] = max(a[2*i], a[2*i+1]);

    int x, xa, xb;
    for(int i=1; i<=m; i++) {
        cin >> x >> xa >> xb;
        if(x == 0)
            cout << query(xa, xb, 1, 1, pn-1) << '\n';
        if(x == 1)
            update(pn+xa-1, xb);
    }

    return 0;
}