Cod sursa(job #2754524)

Utilizator Costin_PintilieHoratiu-Costin-Petru Pintilie Costin_Pintilie Data 25 mai 2021 23:13:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
//Bibiliografie:
//https://www.hackerearth.com/practice/data-structures/advanced-data-structures/segment-trees/tutorial/
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y,z,comanda, tree[400004];
 int arr[100001];

void build(int node, int start, int end){
    if(start == end){
        tree[node] = arr[start];
    }else{
        int mid = (start + end)/2;
        build(2*node, start, mid);

        build(2*node + 1,mid+1, end);

        tree[node] = max(tree[2*node], tree[2*node + 1] );

        }
}

void update(int node, int start, int end, int indx, int val){
    if(start == end){
        arr[indx] = val;
        tree[node] = val;
    }else{
        int mid = (start + end)/2;
        if(start <= indx && indx <= mid){//fiul stang
            update(2*node,start, mid, indx, val);
        }else{
            update(2*node + 1,mid+1, end,indx, val);
        }
    tree[node] = max(tree[2*node], tree[2*node + 1]);
    }

}

int maxQuery(int node, int start, int end, int l , int r){
    if(r < start || l > end)
        return 0;

    if(l <= start && end <= r)
        return tree[node];

    int mid = (start + end) / 2;
    int p1 = maxQuery(2*node, start, mid, l, r);
    int p2 = maxQuery(2*node + 1, mid + 1, end, l, r);
    return max(p1,p2);
}
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int main()
{
    fin>>n>>m;
    for(int i = 0; i< n; i++){
        fin>>x;
        arr[i] =x;
    }
    build(1,0,n-1);

    for(int i = 0; i < m; i++){
        fin>>comanda;
        if(comanda == 0){
            fin>>y>>z;
            fout<<maxQuery(1,0,n-1,y-1,z-1)<<"\n";
        }
        else{
            fin>>y>>z;
            update(1,1,n,y,z);
        }

    }
    fin.close();
    fout.close();
    return 0;
}