Cod sursa(job #2814338)

Utilizator LuciBBadea Lucian LuciB Data 7 decembrie 2021 22:50:59
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
// Teo, e cod vechi dar m-ai rugat sa fac iterativ :)

#include <bits/stdc++.h>
using namespace std;
const int NMAX=1e5;
const int INFINIT=1e9+7;
const int LEN=(1<<18);
int v[LEN/2], tree[LEN], minn=NMAX;
int lstart, rstart;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int n){
    for(int i=0; i<n; i++)
        tree[i+n-1]=v[i];
    for(int i=n-2; i>=0; i--)
        tree[i]=max(tree[2*i+1], tree[2*i+2]);
}
void update(int poz, int val, int n){
    tree[poz+n-1]=val;
    int i=poz+n-1;
    while(i>0){
        if(i%2==1)
            tree[(i-1)/2]=max(tree[i], tree[i+1]);
        else
            tree[(i-1)/2]=max(tree[i], tree[i-1]);
        i=(i-1)/2;
    }
}
void maximum(int i, int l, int r){ /// node i has interval [l, r]
    if(rstart<l || lstart>r) return;
    else if(l>=lstart && r<=rstart){
        minn=max(minn, tree[i]);
        return;
    }else{
        int mid=(l+r)/2;
        maximum(2*i+1, l, mid);
        maximum(2*i+2, mid+1, r);
    }
}
int main(){
    int n, m, op, l, r;
    //cout<<(1<<18);
    fin>>n>>m;
    for(int i=0; i<n; i++) fin>>v[i];
    int nn=1;
    while(nn<=n) nn<<=1;
    //cout<<nn<<endl;
    for(int i=n; i<nn; i++) v[i]=-INFINIT;
    build(nn);
    for(int i=0; i<m; i++){
        //int op, l, r;
        fin>>op>>l>>r;
        if(op==1){
            update(l-1, r, nn);
            //for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
        }else{
            minn=-INFINIT;
            lstart=l-1;
            rstart=r-1;
            maximum(0, 0, nn-1);
            fout<<minn<<endl;
        }
    }
    //for(int i=0; i<2*nn-1; i++) cout<<tree[i]<<' ';
    return 0;
}