Cod sursa(job #2004263)

Utilizator LucaSeriSeritan Luca LucaSeri Data 25 iulie 2017 13:45:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;
const int MaxN = 100005;

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

class Aint{
public:
    void solve(){
        int n, m;
        f >> n >> m;
        Start(n);
        for(int i = 1, x; i <= n; i++){
            f >> x;
            Update(1, 1, n, i, x);
        }

        for(int t, a, b; m > 0; --m){
            f >> t >> a >> b;
            if(t){
                Update(1, 1, n, a, b);
            }
            else g << Range_Query(1, 1, n, a, b) << '\n';
        }
    }

private:
    int Max[MaxN << 2];
    void Start(int n){
        for(int i = 0; i <= n<<2; ++i){
            Max[i] = 0;
        }
    }

    void Update(int node, int st, int dr, int poz, int val){
        if(st == dr){
            Max[node] = val;
            return;
        }
        int mij = st+dr>>1;
        if(mij >= poz) Update(node<<1, st, mij, poz, val);
        else Update(node<<1|1, mij+1, dr, poz, val);
        Max[node] = max(Max[node<<1], Max[node<<1|1]);
    }

    int Range_Query(int node, int st, int dr, int a, int b){
        if(a <= st && dr <= b){
            return Max[node];
        }
        int mij = st+dr>>1, Left_Max = 0, Right_Max = 0;
        if(mij >= a ) Left_Max = Range_Query(node<<1, st, mij, a, b);
        if(mij < b)  Right_Max = Range_Query(node<<1|1, mij+1, dr, a, b);
        return max(Left_Max, Right_Max);
    }

}Arbore;


int main()
{
    Arbore.solve();
    return 0;
}