Cod sursa(job #2289300)

Utilizator BlkAlexAlex Negru BlkAlex Data 24 noiembrie 2018 12:46:55
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

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

int v[Nmax], a[4*Nmax], n, m;
int poz;
int start, stop;

void build (int l, int r, int node){
    if (l==r){
        a[node]=v[l];
    } else {
        int mid = (l+r)/2;
        build (l, mid, 2*node);
        build (mid+1, r, 2*node+1);
        a[node] = max(a[2*node],a[2*node+1]);
    }
}

void update (int l, int r, int node){
    if (l==r){
        a[node]=v[l];
    } else {
        int mid = (l+r)/2;
        if (poz <= mid) update (l, mid, 2*node);
        else update (mid+1, r, 2*node+1);
        a[node] = max(a[2*node],a[2*node+1]);
    }
}

int query (int l, int r, int node){
    if (start <= l and stop >= r){
        return a[node];
    } else {
        int mid = (l+r)/2;
        int maxl = INT_MIN, maxr = INT_MIN;
        if (start <= mid) maxl = query (l, mid, 2*node);
        if (mid+1 <= stop) maxr = query (mid+1, r, 2*node+1);
        return max(maxl, maxr);
    }
}

int main()
{
    f>>n>>m;
    for (int i = 1; i <= n; i++){
        f>>v[i];
    }
    build(1, n, 1);
    int op, x, y;
    for (int i = 1; i <= m; i++){
        f >> op >> x >> y;
        if(op == 0){
            start = x;
            stop = y;
            g << query(1, n, 1) << '\n';
        } else {
            v[x]=y;
            poz=x;
            update(1, n, 1);
        }
    }
    return 0;
}