Cod sursa(job #2010491)

Utilizator vasi461Vasiliu Dragos vasi461 Data 13 august 2017 13:01:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
using namespace std;

#define MAX 100005

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int n, m, v[MAX], o, x, y, aint[4 * MAX], q;

///indicele nodului - k, parametrii intervalului - x,y
void arbore(int k, int a, int b)
{
    if(a == b)
    {
        aint[k] = v[a];
        return;
    }
    int mij = (a + b) / 2;
    arbore(2 * k, a, mij);
    arbore(2 * k + 1, mij + 1, b);
    aint[k] = max(aint[2 * k], aint[2 * k + 1]);
}  

void query(int k, int a, int b)
{
    if(a >= x and b <= y)
    {
        q = max(aint[k], q);
        return;
    }
    int mij = (a + b) / 2;
    if(x <= mij)
    {
        query(2 * k, a, mij);
    }
    if(y > mij)
    {
        query(2 * k + 1, mij + 1, b);
    }
}

void update(int k, int a, int b)
{
    if(b == a)
    {
        aint[k] = y; 
        return;
    }
    int mij = (a + b) / 2;
    if(x <= mij)
    {
        update(2 * k, a, mij);
    }
    else
    {
        update(2 * k + 1, mij + 1, b);
    }
    aint[k] = max(aint[2 * k], aint[2 * k + 1]);
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        cin >> v[i];
    }
    arbore(1, 1, n);
    for(int i = 1; i <= m; ++i)
    {
        cin >> o >> x >> y;
        if(o == 0)
        {
            q = 0;
            query(1, 1, n);
            cout << q << '\n';
        }
        else
        {
            update(1, 1, n);
        }
    }
    return 0;
}