Cod sursa(job #2271998)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 29 octombrie 2018 16:26:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,m,a[100005],b[1005],rad,k,x,y,tip;
int gbk(int i){
    return (i-1)/rad+1;
}
int query(int s,int d){
    int maxim=-1,bs=gbk(s),bd=gbk(d);
    if(bs==bd){
        for(int i=s;i<=d;i++)
            maxim=max(maxim,a[i]);
        return maxim;
    }
    for(int i=s,cp=bs*rad;i<=cp;i++)
        maxim=max(maxim,a[i]);
    for(int i=bs+1;i<bd;i++)
        maxim=max(maxim,b[i]);
    for(int i=(bd-1)*rad+1;i<=d;i++)
        maxim=max(maxim,a[i]);
    return maxim;
}
void update(int index,int val){
    a[index]=val;
    int bi=gbk(index),s=(bi-1)*rad+1,d=bi*rad;
    b[bi]=a[s];
    for(int i=s+1;i<=d;i++)
        b[bi]=max(b[bi],a[i]);
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    rad=sqrt(n)+1; k=(n-1)/rad+1;
    for(int i=1;i<=n;i++){
        if((i-1)%rad==0) b[gbk(i)]=a[i];
        else b[gbk(i)]=max(a[i],b[gbk(i)]);
    }
    while(m--){
        cin>>tip>>x>>y;
        if(tip==0) cout<<query(x,y)<<'\n';
        else update(x,y);
    }
}