Cod sursa(job #2390332)

Utilizator dorel02Dorel Surubelnita dorel02 Data 27 martie 2019 22:11:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

using namespace std;

int n, m, x, a, b;
int v[400008];

void build_st()
{
    for(int i = n - 1; i > 0; --i)
        v[i] = max(v[2 * i], v[2 * i + 1]);
}

void update(int pos, int value)
{
    pos += n;
    v[pos] = value;
    for(; pos > 1; pos = pos / 2)
        v[pos / 2] = max(v[pos], v[pos ^ 1]);
}

int query(int l, int r)
{
    //cout<<"Q\n";
    int res = -1; //result
    l += n;
    r += n; //incepem in frunze

    for(; l < r; l = l/2, r = r/2)
    {
        //cout<<"Intervalul: "<<l<<", "<<r<<"\n";
        if(l & 1)
        {
            res = max(res, v[l]);
            //cout<<"l "<<res<<"\n";
            ++l;
        }
        if(r & 1)
        {
            --r;
            res = max(res, v[r]);
            //cout<<"r "<<res<<"\n";
        }
    }

    return res;
}

int main()
{
    ifstream in ("arbint.in");
    ofstream out ("arbint.out");

    char c;
    in>>n>>m;

    for (int i = 0; i < n; ++i)
        in>>v[n + i];
    build_st();

    for(int i = 0; i < m; ++i)
    {
        in>>c>>a>>b;
        if(c == '0')
            out<<query(a - 1, b)<<'\n';

        if(c == '1')
            update(a - 1, b);
    }
    return 0;
}