Cod sursa(job #2516137)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 30 decembrie 2019 14:30:52
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out("arbint.out");
const int mini=-1;
int arb[231100], m, n, op, x, y;
int a[100010];
int construieste(int st, int dr, int poz)
{
    if(st>dr)
        return mini;

    if(st==dr)
        return arb[poz]=a[st];

    int mij=(st+dr)/2;
    return arb[poz]=max(construieste(st, mij, 2*poz), construieste(mij+1, dr, 2*poz+1));
}
int cauta(int qst, int qdr, int st, int dr, int poz)
{
    if(st>qdr||dr<qst||st>dr)
        return mini;
    if(qst<=st&&dr<=qdr)
        return arb[poz];
    int mij=(st+dr)/2;
    return max(cauta(qst, qdr, st, mij, 2*poz), cauta(qst, qdr, mij+1, dr, 2*poz+1));
}
void update(int val, int qp, int st, int dr, int poz)
{
    if(st>dr) return;
    if(st==dr&&st==qp) {arb[poz]=val; return;}
    else if(st==dr) return;
    int mij=(st+dr)/2;
    update(val, qp, st, mij, 2*poz);
    update(val, qp, mij+1, dr, 2*poz+1);
    arb[poz]=max(arb[2*poz], arb[2*poz+1]);
    return;
}
int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
        in>>a[i];
    construieste(1, n, 1);
    for(int i=1; i<=m; i++)
    {
        in>>op>>x>>y;
        if(op==0)
            out<<cauta(x, y, 1, n, 1)<<"\n";
        else
            update(y, x, 1, n, 1);
    }
    return 0;
}