Cod sursa(job #2516148)

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

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