Cod sursa(job #2614465)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 11 mai 2020 19:30:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct Nod
{
    int x, st, dr, t, a, b;
    bool info;
};

int n, m, cnt, V[100001], I[100001];
Nod A[200001];

void Constr(int a, int b, int ind)
{
    if (a == b)
    {
        A[ind].x = V[a];
        A[ind].st = A[ind].dr = 0;
        A[ind].a = A[ind].b = a;
        I[a] = ind;
    }
    else
    {
        A[++cnt].t = ind;
        A[cnt].info = false;
        A[ind].st = cnt;
        Constr(a, (a + b) / 2, cnt);
        A[ind].a = A[A[ind].st].a;

        A[++cnt].t = ind;
        A[cnt].info = true;
        A[ind].dr = cnt;
        Constr((a + b) / 2 + 1, b, cnt);
        A[ind].x = max(A[A[ind].st].x, A[A[ind].dr].x);
        A[ind].b = A[A[ind].dr].b;
    }
}

void GetMax(int &a, int &b, int nod, int& ma)
{
    ma = max(ma, A[nod].x);
    if (A[nod].b < b)
    {
        if (!A[nod].info && A[A[nod].t].b <= b)
            GetMax(a, b, A[nod].t, ma);
        else GetMax(a, b, I[A[nod].b + 1], ma);
    }
}

void UpdateMax(int nod)
{
    if (nod == 0)
        return;
    if (max(A[A[nod].st].x, A[A[nod].dr].x) != A[nod].x)
    {
        A[nod].x = max(A[A[nod].st].x, A[A[nod].dr].x);
        UpdateMax(A[nod].t);
    }
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
        fin >> V[i];
    Constr(1, n, 1);
    for (int i = 1; i <= m; ++i)
    {
        int c, a, b;
        fin >> c >> a >> b;
        if (c == 0)
        {
            int ma = 0;
            GetMax(a, b, I[a], ma);
            fout << ma << '\n';
        }
        else
        {
            A[I[a]].x = b;
            UpdateMax(A[I[a]].t);
        }
    }

    return 0;
}