Cod sursa(job #1960585)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 10 aprilie 2017 15:44:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 1e5 + 100;

int arb[2*maxn] = {};
char ibuf[maxn], obuf[maxn];

void update(int p, const int val){
    arb[p+=maxn] = val;
    for(p/=2; p; p/=2) arb[p] = max(arb[2*p], arb[2*p+1]); }

int query(int st, int dr){
    int rez = 0;
    for(st+=maxn, dr+=maxn+1; st < dr; st /= 2, dr /= 2){
        if(st%2) rez = max(rez, arb[st++]);
        if(dr%2) rez = max(rez, arb[--dr]); }
    return rez; }

ifstream f;
ofstream g;

int main(){
    f.rdbuf()->pubsetbuf(ibuf, maxn);
    g.rdbuf()->pubsetbuf(obuf, maxn);
    f.open("arbint.in");
    g.open("arbint.out");

    int n, q;
    f >> n >> q;
    for(int i = 1; i <= n; ++i) f >> arb[i+maxn];
    for(int i = maxn-1; i; --i) arb[i] = max(arb[2*i], arb[2*i+1]);
    for(int i = 0, t, a, b; i < q; ++i){
        f >> t >> a >> b;
        if(t == 0) g << query(a, b) << '\n';
        else update(a, b); }
    return 0; }