Cod sursa(job #3139442)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 28 iunie 2023 12:27:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdint>

using namespace std;

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

#define uint32_t int

const int maxN = 100005, inf = 0x3f3f3f3f;
int n, q, v[maxN];

class ArboreDeIntervale {
private:
    int type;
    int aint[4 * maxN];
    void join(int node) {
        if(type == 1)
            aint[node] = max(aint[2 * node], aint[2 * node + 1]);
        if(type == 2)
            aint[node] = min(aint[2 * node], aint[2 * node + 1]);
        if(type == 3)
            aint[node] = aint[2 * node] + aint[2 * node + 1];
    }
public:
    void build(int node = 1, int st = 1, int dr = n) {
        if(st == dr)
        {
            aint[node] = v[st];
            return;
        }
        int med = (st + dr) / 2;
        build(2 * node, st, med);
        build(2 * node + 1, med + 1, dr);
        join(node);
    }
    void update(int poz, int node = 1, int st = 1, int dr = n) {
        if(st == dr)
        {
            aint[node] = v[poz];
            return;
        }
        int med = (st + dr) / 2;
        if(poz <= med)
            update(poz, 2 * node, st, med);
        else
            update(poz, 2 * node + 1, med + 1, dr);
        join(node);
    }
    int query(int qst, int qdr, int node = 1, int st = 1, int dr = n) {
        if(qst <= st && dr <= qdr)
            return aint[node];
        int med = (st + dr) / 2, aux = -inf;
        if(qst <= med)
            aux = max(aux, query(qst, qdr, 2 * node, st, med));
        if(med < qdr)
            aux = max(aux, query(qst, qdr, 2 * node + 1, med + 1, dr));
        return aux;
    }
    ArboreDeIntervale(int type) {
        this->type = type;
        build(1, 1, n);
    }
};

int main()
{
    fin >> n >> q;
    ArboreDeIntervale aint(1);
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    aint.build(1);
    while(q--)
    {
        int type;
        fin >> type;
        if(type == 0)
        {
            int st, dr;
            fin >> st >> dr;
            fout << aint.query(st, dr) << '\n';
        }
        if(type == 1)
        {
            int poz, val;
            fin >> poz >> val;
            v[poz] = val;
            aint.update(poz);
        }
    }
    return 0;
}