Cod sursa(job #2224021)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 22 iulie 2018 15:17:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
using namespace std;
const int Maxx=4e5+66;
const int N=1e5+1;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
bool op;
int m,n,st,dr;
int A[N];
int aint[Maxx];
int poz,val,ans;
void upp(int node){
    aint[node]=max(aint[2*node],aint[2*node+1]);
}
void build(int node,int left,int right){
    if (left==right){
        aint[node]=A[left];
        return;
    }
    int mid=(left+right)/2;
    build(2*node,left,mid);
    build(2*node+1,mid+1,right);
    upp(node);
}
void update(int node,int left,int right){
    if (left==right){
        aint[node]=val;
        return;
    }
    int mid=(left+right)/2;
    if (poz<=mid) update(2*node,left,mid);
    else          update(2*node+1,mid+1,right);
    upp(node);
}
void querry(int node,int left,int right){
    if (st<=left && right<=dr){
        ans=max(ans,aint[node]);
        return;
    }
    int mid=(left+right)/2;
    if (st<=mid) querry(2*node,left,mid);
    if (mid<dr)  querry(2*node+1,mid+1,right);
}
int main() {
    fin>>n>>m;
    for (int i=1;i<=n;++i) fin>>A[i];
    build(1,1,n);
    for(;m--;){
        fin>>op>>st>>dr;
        if (!op){
            ans=-1;
            querry(1,1,n);
            fout<<ans<<"\n";
            continue;
        }
        poz=st;
        val=dr;
        update(1,1,n);
    }
    return 0;
}