Cod sursa(job #2360705)

Utilizator KemyKoTeo Virghi KemyKo Data 2 martie 2019 08:52:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int INF = 2e9;
int n, m;
vector <int> sTree;

void query(int a, int b)
{
    int mx = -INF;
    a += n - 1;
    b += n;

    while(a < b){
        if(a & 1)
            mx = max(mx, sTree[a++]);

        if(b & 1)
            mx = max(mx, sTree[--b]);

        a >>= 1;
        b >>= 1;
    }

    g << mx << '\n';
}

void update(int pos, int val)
{
    pos += n - 1;
    sTree[pos] = val;

    while(pos > 0){
        pos >>= 1;

        sTree[pos] = max(
            sTree[pos<<1], sTree[pos<<1|1]
        );
    }
}

int main()
{
    int i, op, x, y;

    f >> n >> m;
    sTree = vector <int> (2 * (n+1), 0);

    for(i=0; i<n; ++i){
        f >> x;

        sTree[n + i] = x;
    }

    for(i=n-1; i>0; --i)
        sTree[i] = max(
            sTree[i<<1], sTree[i<<1|1]
        );

    for(i=1; i<=m; ++i){
        f >> op >> x >> y;
        switch(op){
            case 0:
                query(x, y);
                break;
            case 1:
                update(x, y);
                break;
        }
    }

    return 0;
}