Cod sursa(job #2704374)

Utilizator Uriesu_IuliusUriesu Iulius Uriesu_Iulius Data 10 februarie 2021 14:24:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>

using namespace std;

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

int n, m;
int v[100001], arb[262200];

void Citire()
{
    int i;
    fin >> n >> m;
    for(i = 1; i <= n; i++)
        fin >> v[i];
}

void Initializare(int id, int st, int dr)
{
    if(st == dr)
    {
        arb[id] = v[st];
        return;
    }
    int mij = (st+dr) / 2;
    Initializare(2*id, st, mij);
    Initializare(2*id+1, mij+1, dr);
    arb[id] = max(arb[2*id], arb[2*id+1]);
}

void Actualizare(int id, int st, int dr, int poz)
{
    if(st == dr && st == poz)
    {
        arb[id] = v[st];
        return;
    }
    int mij = (st+dr) / 2;
    if(poz <= mij)
        Actualizare(2*id, st, mij, poz);
    else
        Actualizare(2*id+1, mij+1, dr, poz);
    arb[id] = max(arb[2*id], arb[2*id+1]);
}

int Interogare(int id, int st, int dr, int a, int b)
{
    if(a <= st && b >= dr)
        return arb[id];
    int mij = (st+dr) / 2;
    int max1 = -1, max2 = -1;
    if(a <= mij)
        max1 = Interogare(2*id, st, mij, a, b);
    if(b > mij)
        max2 = Interogare(2*id+1, mij+1, dr, a, b);
    return max(max1, max2);
}

int main()
{
    int i, a, b, op;
    Citire();
    Initializare(1, 1, n);
    for(i = 1; i <= m; i++)
    {
        fin >> op >> a >> b;
        if(op == 1)
        {
            v[a] = b;
            Actualizare(1, 1, n, a);
        }
        else
            fout << Interogare(1, 1, n, a, b) << "\n";
    }
    return 0;
}