Cod sursa(job #2217718)

Utilizator PaulTPaul Tirlisan PaulT Data 1 iulie 2018 17:36:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

using VI = vector<int>;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, p, x, y;
int val, pos, L, R, Max;
VI arb;

void Update(int node, int a, int b);
void Query(int node, int a, int b);

int main()
{
    fin >> n >> m;
    arb = VI(4 * n + 20);
    for (int i = 1; i <= n; i++)
    {
        fin >> val;
        pos = i;
        Update(1, 1, n);
    }
    for (int i = 1; i <= m; i++)
    {
        fin >> p >> x >> y;
        if (p == 0)
        {
            Max = -1;
            L = x;
            R = y;
            Query(1, 1, n);
            fout << Max << '\n';
        }
        else
        {
            pos = x;
            val = y;
            Update(1, 1, n);
        }
    }

    fin.close();
}

void Update(int node, int a, int b)
{
    if (a == b)
    {
        arb[node] = val;
        return;
    }
    int mid = (a + b) / 2;
    if (pos <= mid)
        Update(2 * node, a, mid);
    else
        Update(2 * node + 1, mid + 1, b);
    arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}

void Query(int node, int a, int b)
{
    if (L <= a && b <= R)
    {
        Max = max(Max, arb[node]);
        return;
    }
    int mid = (a + b) / 2;
    if (L <= mid)
        Query(2 * node, a, mid);
    if (mid < R)
        Query(2 * node + 1, mid + 1, b);
}