Cod sursa(job #3030015)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 17 martie 2023 13:21:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <fstream>
#include <cmath>
#include <climits>
#include <vector>

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

const int NMAX = 1e6;
const int INF = INT_MAX;

int v[NMAX + 5];
vector<int> aint;
int rightmax, n;

void build(int node = 1, int left = 1, int right = rightmax)
{
    if(left == right and left > n)
    {
        aint[node] = 0;
        return;
    }

    if(left == right)
    {
        aint[node] = v[left];
        return;
    }

    int mid = (left + right) / 2;

    build(2 * node, left, mid);
    build(2 * node + 1, mid + 1, right);

    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

void update(int pos, int value, int node = 1, int left = 1, int right = rightmax)
{
    if(left == right and left > n)
    {
        aint[node] = 0;
        return;
    }

    if(left == right)
    {
        aint[node] = value;
        return;
    }

    int mid = (left + right) / 2;

    if(pos <= mid)
        update(pos, value, 2 * node, left, mid);

    if(pos > mid)
        update(pos, value, 2 * node + 1, mid + 1, right);

    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

long long query(int left_q, int right_q, int node = 1, int left = 1, int right = rightmax)
{
    if(left_q <= left and right <= right_q)
        return aint[node];

    int mid = (left + right) / 2;
    int leftans = 0, rightans = 0;

    if(left_q <= mid)
        leftans = query(left_q, right_q, 2 * node, left, mid);

    if(mid < right_q)
        rightans = query(left_q, right_q, 2 * node + 1, mid + 1, right);

    return max(leftans, rightans);
}

int main()
{
    int m;
    fin >> n >> m;

    int nodes = 0, exp = log2(n);

    if((1 << exp) == n)
        nodes = 2 * (1 << exp) - 1;
    else
    {
        exp++;
        nodes = 2 * (1 << exp) - 1;
    }
    aint.resize(nodes + 5);
    rightmax = 1 << exp;

    for(int i = 1; i <= n; i++)
        fin >> v[i];

    build();

    for(int i = 1; i <= m; i++)
    {
        bool op;
        fin >> op;

        if(op == 1)
        {
            int pos;
            long long value;
            fin >> pos >> value;
            update(pos, value);
        }

        if(op == 0)
        {
            int left_q, right_q;
            fin >> left_q >> right_q;

            fout << query(left_q, right_q) << '\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}