Cod sursa(job #2548307)

Utilizator alexilasiAlex Ilasi alexilasi Data 16 februarie 2020 15:02:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

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

vector <int> aint;

void update(int nod, int l, int r, int poz, int val)
{
    if(l == r) {aint[nod] = val; return;}

    int m = (l+r)/2;

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

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

int query(int nod, int l, int r, int L, int R)
{
    if(L<=l && r<=R) return aint[nod];

    int m = (l+r)/2;

    int m1 = (L <= m) ? query(nod*2, l, m, L, R) : 0;
    int m2 = (m < R) ? query(nod*2+1, m+1, r, L, R) : 0;

    return max(m1, m2);
}

int main()
{
    int n, q; fin >> n >> q;
    aint.assign(4*n + 10, 0);
    for(int i=1; i<=n; i++)
    {
        int x; fin >> x;
        update(1, 1, n, i, x);
    }
    for(int i=1; i<=q; i++)
    {
        int t, a, b; fin >> t >> a >> b;
        if(t == 0) fout << query(1, 1, n, a, b) << '\n';
        else update(1, 1, n, a, b);
    }
    return 0;
}