Cod sursa(job #2648274)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 9 septembrie 2020 18:22:47
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;

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

int m,n;
// vector<int> ai;
const int NMAX=1e5+1;
int ai[NMAX*4];

void update(int ind, int val, int le=1,int ri=n, int node=0){
    if(le==ri) {
        // once
        ai[node]=val;
        return ;
    }
    int mi=(le+ri)/2, nnode=node*2+1; //next node
    if(ind<=mi)
        update(ind,val, le, mi, nnode);
    else
        update(ind,val, mi+1,ri, nnode+1);
    ai[node]=max(ai[nnode],ai[nnode+1]);
}

int search(int a, int b, int le=1, int ri=n, int node=0){
    if(a==le and b==ri) {
        // cout<<ai[node]<<"  ";
        return ai[node];
    }
    int mi=(le+ri)/2, ans=-1;
    node=node*2+1;
    if(a<=mi) ans=max(ans,search(a,min(b,mi), le,mi, node) );
    if(b>mi)  ans=max(ans,search(max(a,mi+1),b, mi+1,ri, node+1) );
    return ans;
}

int main() {
    fin>>n>>m;
    // {
    //     int p=0;
    //     for(int i=1; p<n; p+=i,i<<=1)
    //         ;
    //     ai.resize(p*2,0);
    // }
    for(int i=1;i<=n;++i){
        int x;
        fin>>x;
        update(i,x);
    }
    for(int i=1;i<=m;++i){
        int t, x,y;
        fin>>t>>x>>y;
        if(t==0){
            // max [x,y]
            // cout<<x<<".."<<y<<"\n";
            fout<<search(x,y)<<"\n";
        }
        else {
            // [a]=b
            update(x,y);
        }
    }
}