Cod sursa(job #1863334)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 30 ianuarie 2017 20:46:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#pragma GCC optimize (O3)
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 1e5 + 10;

ifstream f("arbint.in");
ofstream g("arbint.out");

char buf[maxn], *p = buf, *ep = buf + sizeof(buf);
static void adv(){
    if(++p == ep) f.read(p=buf, sizeof(buf)); }

static void setup_parsare(){
    f.read(buf, sizeof(buf)); }

static int get_int(){
    int rhs = 0;
    while(*p < '0') adv();
    while(*p >= '0') rhs = 10 * rhs + *p - '0', adv();
    return rhs; }

int n, m, v[maxn], arb[2*maxn] = {};

static void build_arbint(){
    copy(v, v+n, arb+n);
    for(int i = n-1; i; --i) arb[i] = max(arb[2*i], arb[2*i+1]); }

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

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

int main(){
    n = get_int(), m = get_int();
    for(int i = 0; i < n; ++i) v[i] = get_int();
    build_arbint();

    for(int i = 0, t, a, b; i < m; ++i){
        t = get_int(), a = get_int(), b = get_int();
        if(t == 0) g << query(a-1, b-1) << '\n';
        else update(a-1, b); }
    return 0; }