Cod sursa(job #3125319)

Utilizator GrigMihaiGrigore Mihai GrigMihai Data 2 mai 2023 17:51:36
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>

#include <vector>

using namespace std;

struct IntervalTree {
    vector<int> v;

    explicit IntervalTree(int n) : v(4*n, -1) {}

    void update(int pos, int node, int left, int right, int val) {
        if(left==right)
        {
            v[node]=val;
            return;
        }

        int mij=(left+right)/2;
        if(pos<=mij)
            update(pos, 2*node, left, mij, val);
        else
            update(pos, 2*node+1, mij+1, right, val);

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

    int query(int qleft, int qright, int node, int left, int right) {
        if(qleft>qright)
            return -1;

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

        if(qleft<=left && qright>=right)
            return v[node];

        int mij=(left+right)/2;
        if(qright<=mij)
            return query(qleft, qright, 2*node, left, mij);
        else if(qleft>mij)
            return query(qleft, qright, 2*node+1, mij+1, right);
        else
            return max(query(qleft, mij, 2*node, left, mij), query(mij+1, qright, 2*node+1, mij+1, right));
    }
};

ostream& operator<<(ostream& out, IntervalTree arb) {
    for(int i=1;i<arb.v.size();i++)
        if(arb.v[i]!=-1)
            out<<i<<": "<<arb.v[i]<<'\n';
    return out;
}

int main() {

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

    int n, m;
    in>>n>>m;

    IntervalTree arb(n);

    for(int i=1;i<=n;i++)
    {
        int x;
        in>>x;
        arb.update(i, 1, 1, n, x);
    }

    out<<arb;

    while(m)
    {
        int c, a, b;
        in>>c>>a>>b;
        if(c==0)
        {
            //out<<arb;
            out<<arb.query(a, b, 1, 1, n)<<"\n\n\n";
        }
        else
            arb.update(a, 1, 1, n, b);

        m--;
    }

    return 0;
}