Cod sursa(job #2701247)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 30 ianuarie 2021 11:11:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 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 pozToChange, valueToChange;
int targetSt, targetDr;

void addToTree(int st, int dr, int pozArb)
{
    if(st == dr)
    {
        arb[pozArb] = valueToChange;
        return;
    }
    int mij = (st + dr)/2;
    if(pozToChange <= mij)
        addToTree(st, mij, pozArb * 2);
    else
        addToTree(mij+1, dr, pozArb * 2 + 1);
    arb[pozArb] = max(arb[pozArb * 2], arb[pozArb * 2 + 1]);
}

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)
{
    pozToChange = poz;
    valueToChange = val;
    addToTree(1, n, 1);
}

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

void read()
{
    f>>n>>m;
    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;
}