Cod sursa(job #2686196)

Utilizator DarkwarriorRobert Gaspar Darkwarrior Data 18 decembrie 2020 17:22:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int MAXN=100005;
const int MAXS=sqrt(MAXN)+5;
int n,m,a[MAXN],b[MAXS],s;
void build(){
    for(int i=1; i<=n; i++){
        int j=i/s;
        b[j]=max(b[j],a[i]);
    }
}
void update(int pos,int val){
    a[pos]=val;
    int j=pos/s;
    b[j]=0;
    for(int i=j*s; i<=(j+1)*s-1; i++)
        b[j]=max(b[j],a[i]);
}
int query(int l,int r){
    int jl=l/s,jr=r/s;
    int mx=0;
    if(jl==jr){
        if(l==jl*s&&r==(jr+1)*s-1)
            return b[jl];
        for(int i=l; i<=r; i++)
            mx=max(mx,a[i]);
        return mx;
    }
    if(l==jl*s)
        mx=max(mx,b[jl]);
    else
        for(int i=l; i<=(jl+1)*s-1; i++)
            mx=max(mx,a[i]);
    for(int j=jl+1; j<jr; j++)
        mx=max(mx,b[j]);
    if(r==(jr+1)*s-1)
        mx=max(mx,b[jr]);
    else
        for(int i=jr*s; i<=r; i++)
            mx=max(mx,a[i]);
    return mx;
}

int main(){
    f>>n>>m;
    s=sqrt(n);
    for(int i=1; i<=n; i++){
        f>>a[i];
    }
    build();
    for(int i=0; i<m; i++){
        int x,y,t;
        f>>t>>x>>y;
        if(t==1)
            update(x,y);
        else
            g<<query(x,y)<<"\n";
    }
    return 0;
}