Cod sursa(job #2365946)

Utilizator qwerty1234qwerty qwerty1234 Data 4 martie 2019 17:34:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb

#include <bits/stdc++.h>


using namespace std;

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

const int Nmax = 100005;

int n , q , a[Nmax] , arb[4 * Nmax];

inline void Build(int node , int L , int R)
{
    if(L == R)
    {
        arb[node] = a[L];
        return;
    }
    int M = (L + R) / 2;
    Build(2 * node , L , M);
    Build(2 * node + 1 , M + 1 , R);
    arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
}

inline void Update(int node , int L , int R , int poz , int val)
{
    if(L == R)
    {
        arb[node] = val;
        return;
    }
    int M = (L + R) / 2;
    if(poz <= M)
        Update(2 * node , L , M , poz , val);
    else Update(2 * node + 1 , M + 1 , R , poz , val);
    arb[node] = max(arb[2 * node] , arb[2 * node + 1]);
}

inline int Solve(int node , int L , int R , int X , int Y)
{
    if(L == X && R == Y)
        return arb[node];
    int M;
    M = (L + R) / 2;
    if(Y <= M)
        return Solve(2 * node , L , M , X , Y);
    else if(X > M)
        return Solve(2 * node + 1 , M + 1 , R , X , Y);
    else return max(Solve(2 * node , L  , M , X , M) , Solve(2 * node + 1 , M + 1 , R , M + 1 , Y));
}

int main()
{
    int op , x , y;
    fin >> n >> q;
    for(int i = 1 ; i <= n ; i++)
        fin >> a[i];
    Build(1 , 1 , n);
    while(q -- )
    {
        fin >> op >> x >> y;
        if(op == 0)
            fout << Solve(1 , 1 , n , x , y) << "\n";
        else Update(1 , 1 , n , x , y);
    }
    fin.close();
    fout.close();
    return 0;
}