Cod sursa(job #2475308)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 16 octombrie 2019 19:05:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define N_MAX 100001
using namespace std;

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

int N, M, arb[4*N_MAX];

void update(int valoare, int pozitie, int stanga = 1, int dreapta = N, int nod = 1)
{
    if(stanga == dreapta)
    {
        arb[nod] = valoare;
        return;
    }

    int mijloc = (stanga + dreapta) >> 1;

    if(pozitie <= mijloc)
        update(valoare, pozitie, stanga, mijloc, nod << 1);
    else
        update(valoare, pozitie, mijloc + 1, dreapta, (nod << 1) + 1);


    arb[nod] = max(arb[nod << 1], arb[(nod << 1) + 1]);
}


int query(int a, int b, int stanga = 1, int dreapta = N, int nod = 1)
{
    if(a <= stanga && dreapta <= b) return arb[nod];

    int MAX = 0;

    int mijloc = (stanga + dreapta) >> 1;

    if(a <= mijloc) MAX = max(MAX, query(a, b, stanga, mijloc, nod << 1));

    if(b > mijloc) MAX = max(MAX, query(a, b, mijloc + 1, dreapta, (nod << 1) + 1));

    return MAX;
}

int main()
{
    fin >> N >> M;

    for(int x, i = 1; i <= N; ++i)
    {
        fin >> x;
        update(x, i);
    }

    for(int q, a, b; M; --M)
    {
        fin >> q >> a >> b;

        if(q)
            update(b, a);
        else
            fout << query(a, b) << '\n';
    }
}