Cod sursa(job #2775781)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 17 septembrie 2021 09:23:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;
const int SIZE = 1e5+10;

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

int n, m;
int v[SIZE], arb[SIZE * 4];

void coutArb(int arb[], int ind, int st, int dr)
{
    cout<<st<<" - "<<dr<<" :  "<<arb[ind]<<"\n";
    if(st==dr) return;
    int mid = (st + dr) / 2;
    coutArb(arb, ind*2, st, mid);
    coutArb(arb, ind*2+1, mid+1, dr);
}

void coutArb(int arb[], int length)
{
    coutArb(arb, 1, 1, length);
}

void buildArb(int arb[], int ind, int v[], int st, int dr)
{
    if(st==dr) arb[ind] = v[st];
    if(st>=dr) return;
    int mid = (st + dr) / 2;
    buildArb(arb, ind*2, v, st, mid);
    buildArb(arb, ind*2+1, v, mid+1, dr);
    arb[ind] = max(arb[ind*2], arb[ind*2+1]);
}

void buildArb(int arb[], int v[], int length)
{
    buildArb(arb, 1, v, 1, length);
}

void readit()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
        in>>v[i];
    buildArb(arb, v, n);
    ///coutArb(arb, n);
}

int query(int arb[], int ind, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b) return arb[ind];
    int mid = (st + dr) / 2, r1=0, r2=0;
    if(a<=mid) r1 = query(arb, ind*2, st, mid, a, b);
    if(mid<b) r2 = query(arb, ind*2+1, mid+1, dr, a, b);
    return max(r1, r2);
}

void update(int arb[], int ind, int st, int dr, int pos, int val)
{
    if(st==dr)
    {
        arb[ind] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(pos<=mid) update(arb, ind*2, st, mid, pos, val);
    else update(arb, ind*2+1, mid+1, dr, pos, val);
    arb[ind] = max(arb[ind*2], arb[ind*2+1]);
}

int main()
{
    int qry, a, b;
    readit();
    for(int i=1; i<=m; i++)
    {
        in>>qry>>a>>b;
        if(!qry) out<<query(arb, 1, 1, n, a, b)<<"\n";
        else update(arb, 1, 1, n, a, b);
    }
    return 0;
}