Cod sursa(job #3161015)

Utilizator zetef3Dediu Stefan zetef3 Data 25 octombrie 2023 15:13:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>

using namespace std;

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

const int NMAX=1e5;
const int NAINT=4*NMAX;

int n,m,t;
long long a,b,maxim;
long long aint[NAINT];

void build(int p, int st, int dr) {
    if (st==dr) {
        f >> aint[p];
        return;
    }

    int m=(st+dr)/2, fs=2*p, fd=2*p+1;
    build(fs, st,m);
    build(fd, m+1,dr);

    aint[p]=max(aint[fs],aint[fd]);
}

void query(int p, int st, int dr, int a, int b) {
    if (a<=st && dr<=b) {
        maxim=max(maxim,aint[p]);
        return;
    }

    int m=(st+dr)/2, fs=2*p, fd=2*p+1;

    if (a<=m) query(fs, st,m, a,b);
    if (b>m) query(fd, m+1,dr, a,b);
}

void update(int p, int st, int dr, int poz, int x) {
    if (st==dr) {
        aint[p]=x;
        return;
    }

    int m=(st+dr)/2, fs=2*p, fd=2*p+1;
    if (poz<=m) update(fs, st,m, poz,x);
    else        update(fd, m+1,dr, poz,x);

    aint[p]=max(aint[fs], aint[fd]);
}

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

    build(1,1,n);

    for (int i=1;i<=m;i++) {
        f >> t >> a >> b;
        if (t==0) {
            maxim=-1;
            query(1,1,n,a,b);
            g << maxim << '\n';
        } else {
            update(1,1,n,a,b);
        }
    }

    return 0;
}