Cod sursa(job #2976486)

Utilizator Ciorba21Tuduce Sergiu Ciorba21 Data 9 februarie 2023 11:42:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;

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

const int dim = 1e5+1;
int N, M;
int ma[4*dim+66];
int start, finish, val, pos, maxim;

void update(int nod, int left, int right)
{
    if(left == right)
    {
        ma[nod] = val;
        return;
    }

    int div = (left + right) / 2;
    if(pos <= div) update(2*nod, left, div);
    else update(2*nod+1, div+1, right);

    ma[nod] = max(ma[2*nod], ma[2*nod + 1]);
}

void query(int nod, int left, int right)
{
    if(start <= left and right <= finish)
    {
        if(maxim < ma[nod]) maxim = ma[nod];
        return;
    }

    int div = (left + right) / 2;
    if(start <= div) query(2*nod, left, div);
    if(div < finish) query(2*nod + 1, div+1, right);
}

int main()
{
    int X, A, B;
    fin >> N >> M;
    for(int i=1;i<=N;i++)
    {
        fin >> X;
        pos = i, val = X;
        update(1,1,N);
    }

    for(int i=1;i<=M;i++)
    {
        fin >> X >> A >> B;
        if(X == 0)
        {
            maxim = -1;
            start = A, finish = B;
            query(1,1,N);

            fout << maxim << '\n';
        }
        else {
            pos = A, val = B;
            update(1,1,N);
        }
    }
}