Cod sursa(job #3327515)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 4 decembrie 2025 11:44:25
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int NMAX = 100001;

struct SegmentTree
{
    int ans;
    int left, right;
    SegmentTree *l, *r;
};

void updateVal(SegmentTree *crt, int &pos, int &val)
{
    if (crt->left == crt->right)
    {
        crt->ans = val;
        return;
    }

    int m = (crt->left + crt->right) >> 1;
    if (pos <= m)
        updateVal(crt->l, pos, val);
    else
        updateVal(crt->r, pos, val);
    crt->ans = max(crt->l->ans, crt->r->ans);
}

void queryInterval(SegmentTree *crt, int &queryIntervalLeft, int &queryIntervalRight, int &maxVal)
{
    if (queryIntervalLeft <= crt->left && crt->right <= queryIntervalRight)
    {
        maxVal = max(maxVal, crt->ans);
        return;
    }
    int m = (crt->left + crt->right) >> 1;
    if (queryIntervalLeft <= m)
        queryInterval(crt->l, queryIntervalLeft, queryIntervalRight, maxVal);
    if (m < queryIntervalRight)
        queryInterval(crt->r, queryIntervalLeft, queryIntervalRight, maxVal);
}

void buildSegmentTree(SegmentTree *crt, int left, int right)
{
    crt->left = left;
    crt->right = right;
    if (left == right)
    {
        fin >> crt->ans;
        return;
    }

    int m = (left + right) >> 1;
    crt->l = new SegmentTree();
    crt->r = new SegmentTree();

    buildSegmentTree(crt->l, left, m);
    buildSegmentTree(crt->r, m + 1, right);

    crt->ans = max(crt->l->ans, crt->r->ans);
}

void clearSegmentTree(SegmentTree *crt)
{
    if (crt->left != crt->right)
    {
        clearSegmentTree(crt->l);
        clearSegmentTree(crt->r);
    }
    delete crt;
}

int main()
{
    SegmentTree *st = new SegmentTree();
    int a, n, q, b;
    fin >> n >> q;
    buildSegmentTree(st, 1, n);

    while (q--)
    {
        char x;
        fin >> x >> a >> b;
        if (x == '1')
            updateVal(st, a, b);
        else
        {
            int maxi = 0;
            queryInterval(st, a, b, maxi);
            fout << maxi << "\n";
        }
    }
    clearSegmentTree(st);
    return 0;
}