Cod sursa(job #2609246)

Utilizator WladDalwMvladutu cristian vlad WladDalwM Data 2 mai 2020 12:46:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

int aint[400005];
int v[100005];
void build(int node , int l , int r)
{
    if(l > r)
    return;
    if(l == r)
    {aint[node] = v[l];
    return;}

    int mid = (l + r)/2;
    build(2 * node , l , mid);
    build(2 * node + 1 , mid + 1 , r);
    aint[node] = max(aint[2 * node] , aint[2*node+1]);
}
void update(int node , int l , int r , int poz , int val)
{
    if(l > r || poz >r  || poz < l)
    return;
    if(l == r)
    {aint[node] = val;
    return;}

    int mid = (l + r)/2;
    update( 2 * node , l , mid , poz , val);
    update(2 * node + 1 , mid + 1 ,r , poz , val);
    aint[node] = max(aint[2 * node] , aint[2 * node + 1]);
}
int query(int node , int l , int r , int ql , int qr)
{
    if(l > r || l > qr || r < ql)
        return -1;
    if(ql <= l && r <= qr)
        return aint[node];

    int mid = (l + r) / 2 , maxim;
    maxim = max(query( 2 * node , l , mid , ql , qr) ,
    query(2 * node + 1 , mid + 1 , r , ql , qr));
    return maxim;
}
int main()
{
    int n, m , i , tip , a , b;

    cin >> n >> m;
    for(i = 1; i <= n; i++)
    cin >> v[i];

    build(1,1,n);
    for(i = 1;i <= m;i++)
    {
        cin >> tip >> a >> b;
        if(tip == 0)
            cout << query(1,1,n,a,b) << "\n";
        else
            update(1,1,n,a,b);
  }
  return 0;
}