Cod sursa(job #2755895)

Utilizator ViAlexVisan Alexandru ViAlex Data 28 mai 2021 18:15:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include<iostream>
#include<fstream>
using namespace std;

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

const int mx=1e5+100;
int n,m,val[mx],tree[4*mx];

void read(){
    in>>n>>m;
    for(int i=0;i<n;i++)
        in>>val[i];
}

void build_tree(int index,int l,int r){
    if(l==r){
        tree[index]=val[l];
    }
    else{

        int mid=(l+r)/2;
        build_tree(index*2,l,mid);
        build_tree(index*2+1,mid+1,r);

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

void update(int index,int l,int r,int x,int value){
    if(l==r){
        tree[index]=value;
    }
    else{
        int mid=(l+r)/2;

        if(x<=mid){
            update(index*2,l,mid,x,value);
        }
        else{
            update(index*2+1,mid+1,r,x,value);
        }

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

void update(int index,int value){
    update(1,0,n-1,index,value);
}

int query(int index,int l,int r,int a,int b){
    if(l>=a && r<=b){
        return tree[index];
    }
    else{
        int mid=(l+r)/2,result=-1;
        if(a<=mid){
            result=max(result,query(index*2,l,mid,a,b));
        }
        if(b>mid){
            result=max(result,query(index*2+1,mid+1,r,a,b));
        }
        return result;
    }
}

int query(int l,int r){
    return query(1,0,n-1,l,r);
}

void solve(){
    build_tree(1,0,n-1);
    int x,a,b;
    for(int i=0;i<m;i++){
        in>>x>>a>>b;
        if(x==0){
            out<<query(a-1,b-1)<<'\n';
        }
        else{
            update(a-1,b);
        }
    }
}

int main(){
    read();
    solve();
    return 0;
}