Cod sursa(job #2295817)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 3 decembrie 2018 22:57:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <climits>
using namespace std;

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

int n,m,t,i,j,sol,a[400000];

void build(int nod, int st, int dr){
    if(st==dr){
        fin>>a[nod];
    }else{
        int mid=(st+dr)/2;
        build(2*nod,st,mid);
        build(2*nod+1,mid+1,dr);
        a[nod]=max(a[2*nod],a[2*nod+1]);
    }
}

void update(int nod, int st, int dr){
    if(st==dr){
        a[nod]=j;
    }else{
        int mid=(st+dr)/2;
        if(i<=mid)
            update(2*nod,st,mid);
        else
            update(2*nod+1,mid+1,dr);
        a[nod]=max(a[2*nod],a[2*nod+1]);
    }
}

void query(int nod, int st, int dr){
    if(i<=st && j>=dr){
        sol=max(sol,a[nod]);
    }else{
        int mid=(st+dr)/2;
        if(i<=mid)
            query(2*nod,st,mid);
        if(j>mid)
            query(2*nod+1,mid+1,dr);
    }
}

int main(){
    fin>>n>>m;
    build(1,1,n);

    for(;m;m--){
        fin>>t>>i>>j;
        sol=INT_MIN;
        if(t==0){
            query(1,1,n);
            fout<<sol<<"\n";
        }else
            update(1,1,n);
    }

    return 0;
}