Cod sursa(job #3188126)

Utilizator CipriEuCruceanu Ciprian Constantin CipriEu Data 1 ianuarie 2024 19:51:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, c, x, y;
int v[400001];

int query(int lo, int hi, int st, int dr, int k){
    //cout<<"query: "<<lo<<" "<<hi<<" ("<<st<<" "<<dr<<" "<<k<<")\n";
    if(lo <= st && dr <= hi || st == dr) return v[k];
    else{
        int a=0, b=0, m = (st+dr)/2;
        if(m >= lo) a = query(lo, hi, st, m, k*2+1);
        if(m+1 <= hi) b = query(lo, hi, m+1, dr, k*2+2);
        return max(a, b);
    }
}

void update(int poz, int val, int st, int dr, int k){
    //cout<<"update: "<<poz<<" "<<val<<" ("<<st<<" "<<dr<<" "<<k<<")\n";
    if(st == dr) v[k] = val;
    else{
        int m = (st+dr)/2;
        if(poz <= m) update(poz, val, st, m, k*2+1);
        else update(poz, val, m+1, dr, k*2+2);
        v[k] = max(v[k*2+1], v[k*2+2]);
    }
}

int main(){
    fin>>n>>m;
    for(int i=1; i<=n; i++){
        fin>>x;
        update(i, x, 1, n, 0);
    }
    for(int i=1; i<=m; i++){
        fin>>c>>x>>y;
        if(c) update(x, y, 1, n, 0);
        else fout<<query(x, y, 1, n, 0)<<"\n";      
    }
}