Cod sursa(job #2701256)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 30 ianuarie 2021 11:29:07
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#define MAX_N 100005

using namespace std;

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

int arb[4 * MAX_N];
int n, m;
int power2 = 1;
int targetSt, targetDr;

int getMax(int st, int dr, int pozArb)
{
    if(dr < targetSt || st > targetDr)
        return 0;
    if(dr <= targetDr && st >= targetSt)
        return arb[pozArb];
    int mij = (st + dr)/2;
    return max(getMax(st, mij, pozArb * 2), getMax(mij+1, dr, pozArb * 2 + 1));
}

void insertTree(int poz, int val)
{
    int pozArb = power2 + poz - 1;
    arb[pozArb] = val;
    while(pozArb > 1)
    {
        pozArb>>=1;
        arb[pozArb] = max(arb[pozArb * 2], arb[pozArb * 2 + 1]);
    }
}

int queryTree(int st, int dr)
{
    targetDr = dr;
    targetSt = st;
    return getMax(1, power2, 1);
}

void read()
{
    f>>n>>m;
    while(power2 < n)
        power2 <<= 1;
    int x;
    for(int i = 1; i<=n; i++)
    {
        f>>x;
        insertTree(i, x);
    }
}

void solve()
{
    int x, y, q;
    for(int i = 0; i<m; i++)
    {
        f>>q>>x>>y;
        if(q == 0)
            g<<queryTree(x, y)<<"\n";
        else
            insertTree(x, y);
    }
}

int main()
{
    read();
    solve();
    return 0;
}