Cod sursa(job #2095232)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 27 decembrie 2017 11:37:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>
#define Nmax 131073
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int A[2*Nmax],n,m,N=1;

void build(){
    for (int i = N-1; i >= 1; i--) A[i] = max(A[i<<1], A[i<<1|1]);
}

void modify(int p,int val){
    for (A[p += N-1] = val; p > 1; p >>= 1) A[p>>1] = max(A[p], A[p^1]);
}

int query(int l,int r){
    int res = 0;
    for (l += N-1, r += N-1; l <= r; l >>= 1, r >>= 1){
        if (l & 1)              res = max(res, A[l++]);
        if (!(r & 1) && r != l) res = max(res, A[r--]);
        if (l == r) return max(res, A[l]);
    }
    return res;
}

int main()
{
    f>>n>>m;

    while (N<n) N<<=1;

    for (int i=1;i<=n;i++)
        f>>A[N+i-1];

    build();
    int t,p,val;
    for (int i=1;i<=m;i++){
        f>>t>>p>>val;
        if (t==0) g<<query(p,val)<<'\n';
        else modify(p,val);
    }

    return 0;
}