Cod sursa(job #2487332)

Utilizator Bogdy_PPrunescu Bogdan Bogdy_P Data 4 noiembrie 2019 16:09:40
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, t[400010], m , Q, A, B, a[100010];
void build(int a[], int v, int tl, int tr)
{
    if(tl == tr)
        t[v] = a[tl];
    else
    {
        int tm = (tl + tr) / 2;
        build(a, v * 2, tl, tm);
        build(a, v * 2 + 1, tm + 1, tr);
        t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
}
int Max(int v,int tl, int tr, int l, int r)
{
    if(l > r) return 0;
    if(l == tl && r == tr)
        return t[v];
    int tm = (tl + tr) / 2;
    return max(Max(v * 2, tl, tm, l, min(tm, r))
        , Max(v * 2 + 1,tm + 1, tr, max(l, tm + 1), r));
}
void update(int v,int tl, int tr, int pos,int val)
{
    if(tl == tr)
        t[v] = val;
    else
    {
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            update(v * 2, tl, tm, pos, val);
        else
            update(v * 2 + 1, tm + 1,tr, pos, val);
        t[v] = max(t[v * 2] ,t[v * 2 + 1]);
    }
}
int main()
{
    in >> n >> m;
    for(int i = 1;i <= n;i++)
        in >> a[i];
    build(a, 1, 1, n);
    for(int i = 1;i <= m;i++)
    {
        in >> Q >> A >> B;
        if(Q == 1)update(1, 1, n, A, B);
        else out << Max(1, 1, n, A, B);
    }
    return 0;
}