Cod sursa(job #3121395)

Utilizator CondoracheAlexandruCondorache Alexandru CondoracheAlexandru Data 12 aprilie 2023 15:06:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int maxn=1e5+5; 
int v[maxn],seg_tree[4*maxn],n,m;
void build(int node,int left,int right){
    if(left==right)
        seg_tree[node]=v[left];
    else{
	    int middle=(left+right)/2;
        build(2*node,left,middle);
        build(2*node+1,middle+1,right);
        seg_tree[node]=max(seg_tree[2*node],seg_tree[2*node+1]);
    }
}
 
void update (int node , int left , int right , int position , int new_value){
    if(left == right)
        seg_tree[node] = new_value;
    else{
        int middle = (left + right) / 2;
        if(position <= middle)
            update(2 * node , left , middle , position , new_value);
        else
       	    update(2 * node + 1 , middle + 1 , right , position , new_value);
        seg_tree[node] = max(seg_tree[2 * node] , seg_tree[2 * node + 1]);
    }
}
 
int query (int node , int left , int right , int queryLeft , int queryRight){
    if(left >= queryLeft && right <= queryRight)
        return seg_tree[node];
    else{
        int middle = (left + right) / 2;
        if(queryRight <= middle)
            return query(2 * node , left , middle , queryLeft , queryRight);
        if(queryLeft >= middle + 1)
            return query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight);
        return max(query(2 * node , left , middle , queryLeft , queryRight) , query(2 * node + 1 , middle + 1 , right , queryLeft , queryRight));
    }
}
 
int main(){
	ifstream cin("arbint.in");
	ofstream cout("arbint.out");
    cin >> n >> m;
    for(int i = 1 ; i <= n ; ++i)
        cin >> v[i];
    build(1 , 1 , n);
    while(m--){
        bool operation;
        int left , right , position , value;
        cin >> operation;
        if(operation == 0){
            cin >> left >> right;
            cout << query(1 , 1 , n , left , right) << '\n';
        }
        else{
            cin >> position >> value;
            update(1 , 1 , n , position , value);
        }
    }
    return 0;
}