Cod sursa(job #1789156)

Utilizator grimmerFlorescu Luca grimmer Data 26 octombrie 2016 18:54:45
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100000, INF = 999999999;

int v[NMAX + 5], n, m, st[NMAX + 5];

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

        st[node] = max(st[node * 2], st[node * 2 + 1]);
    }
}

void Update(int node, int l, int r, int p, int val){
    if(l == r){
        st[node] = val;
        v[p] = val;
        return;
    }
    else{
        int m = (l + r) / 2;
        int ls = node * 2, rs = node * 2 + 1;

        if(p <= m){
            Update(ls, l, m, p, val);
        }
        else{
            Update(rs, m + 1, r, p, val);
        }

        st[node] = max(st[ls], st[rs]);
    }
}

int Query(int node, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr){
        return st[node];
    }

    int m = (l + r) / 2;
    int ls = node * 2, rs = ls + 1;

    int ans = -INF;
    if (ql <= m){
        ans = max(ans, Query(ls, l, m, ql, qr));
    }
    if (qr > m){
        ans = max(ans, Query(rs, m + 1, r, ql, qr));
    }

    return ans;
}

int main()
{
    int i, op, x, y, ans;
    fin>>n>>m;

    for(i = 1; i <= n; ++i){
        fin>>v[i];
    }

    build(1, 1, n);

    for(i = 1; i <= m; ++i){
        fin>>op>>x>>y;

        if(op == 1){
            Update(1, 1, n, x, y);
        }
        else{
            ans = Query(1, 1, n, x, y);
            fout<<ans<<"\n";
        }

    }
    return 0;
}