Cod sursa(job #1737986)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 5 august 2016 14:58:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

#define NMax 100005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,l,r,sol,v,q,x;
int TR[NMax * 4];

void range_update(int node, int x,int y, int l, int r, int v){
    if(l <= x && y <= r){
        TR[node] = v;
    }else{
        int mid = (x + y) / 2;
        if(l <= mid){
            range_update(2 * node, x, mid, l , r, v);
        }
        if(r > mid){
            range_update(2 * node + 1, mid + 1, y, l , r, v);
        }
        TR[node] = max(TR[2 * node], TR[2 * node + 1]);
    }
}
void range_query(int node, int x, int y, int l, int r){
    if(l <= x && y <= r){
        sol = max(sol, TR[node]);
    }else{
        int mid = (x + y) / 2;
        if(l <= mid){
            range_query(2 * node, x, mid, l , r);
        }
        if(r > mid){
            range_query(2 * node + 1, mid + 1, y, l , r);
        }
    }
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i){
        f >> v;
        range_update(1,1,n,i,i,v);
    }
    for(int i = 1; i <= m; ++i){
        f >> q;
        if(q == 1){
            f >> x >> v;
            range_update(1,1,n,x,x,v);
        }else{
            f >> l >> r;
            sol = -INF;
            range_query(1,1,n,l,r);
            g << sol << '\n';
        }
    }
    return 0;
}