Cod sursa(job #3244474)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 24 septembrie 2024 21:32:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=1e5+5;
int n,m,a[dim],aint[4*dim],mx;
void build(int nod, int st, int dr){
    if(st==dr){
        aint[nod]=a[st];
    }
    else{
        int mid=(st+dr)/2;
        build(2*nod,st,mid);
        build(2*nod+1,mid+1,dr);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}
void update(int nod, int st, int dr, int poz, int val){
    if(st==dr){
        aint[nod]=val;
    }
    else{
        int mid=(st+dr)/2;
        if(poz<=mid){
            update(2*nod,st,mid,poz,val);
        }
        if(poz>mid){
            update(2*nod+1,mid+1,dr,poz,val);
        }
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}
void query(int nod, int st, int dr, int x, int y){
    if(x<=st and dr<=y){
        mx=max(mx,aint[nod]);
    }
    else{
        int mid=(st+dr)/2;
        if(x<=mid){
            query(2*nod,st,mid,x,y);
        }
        if(y>mid){
            query(2*nod+1,mid+1,dr,x,y);
        }
    }
}
signed main(){
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    for(int i=1;i<=n;i++){
        f>>a[i];
    }
    build(1,1,n);
    while(m--){
        int t,x,y;
        f>>t>>x>>y;
        if(t==0){
            mx=0;
            query(1,1,n,x,y);
            g<<mx<<'\n';
        }
        else{
            update(1,1,n,x,y);
        }
    }
    return 0;
}