Cod sursa(job #3151132)

Utilizator GrigMihaiGrigore Mihai GrigMihai Data 19 septembrie 2023 20:26:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
using namespace std;

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

struct Arbint {
    int n;
    int size;
    int* v;

    Arbint(int n) : n(n), size(1) {
        while(size<n)
            size<<=1;
        size<<=1;
        v = new int[size];
        for(int i=0;i<size;i++)
            v[i]=-1;
    }
    ~Arbint() { delete[] v; }


    void update(int i, int x, int node, int st, int dr)
    {


        if(st==dr)
        {
            v[node]=x;
            return;
        }

        int mid=(st+dr)/2;

        if(i<=mid)
            update(i, x, 2*node, st, mid);
        else
            update(i, x, 2*node+1, mid+1, dr);

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

    int getmax(int a, int b, int node, int st, int dr)
    {
        if(st==dr||a<=st&&b>=dr)
            return v[node];

        int mid=(st+dr)/2;

        int x=-1, y=-1;
        if(a<=mid)
            x=getmax(a, min(mid, b), 2*node, st, mid);
        if(b>mid)
            y=getmax(max(a, mid+1), b, 2*node+1, mid+1, dr);

        return max(x, y);
    }
};


int main() {

    int n, m;
    in>>n>>m;
    Arbint arb(n);

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

    while(m)
    {
        int c;
        in>>c;
        if(c==0)
        {
            int a, b;
            in>>a>>b;
            out<<arb.getmax(a, b, 1, 1, n)<<'\n';
        }
        else
        {
            int i, x;
            in>>i>>x;
            arb.update(i, x, 1, 1, n);
        }

        m--;
    }

    return 0;
}