Cod sursa(job #2117450)

Utilizator tanasaradutanasaradu tanasaradu Data 28 ianuarie 2018 21:16:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int Nmax = 100000;
const int inf = (1 << 30);
int aint[4 * Nmax] , k , n , Q;
inline void Update(int p , int x)
{
    int father;
    aint[p] = x;
    while(p >= 1)
    {
        father = p / 2;
        aint[father] = max(aint[father * 2] , aint[father * 2 + 1]);
        p = father;
    }
}
inline void Read_Build()
{
    int p , x;
    fin >> k >> Q;
    n = 1;
    while(n < k)
        n *= 2;
    p = n;
    for(int i = 1 ; i <= k ; i++)
    {
        fin >> x;
        aint[p++] = x;
    }
    for(; p <= 2 * n - 1 ; p++)
        aint[p] = - inf;
    for(int i = n - 1 ; i >= 1 ; i--)
        aint[i] = max(aint[2 * i] , aint[2 * i + 1]);

}
inline int Query(int k , int st , int dr , int x , int y)
{
    if(st == x && dr == y)
        return aint[k];
    int m;
    m = (st + dr) / 2;
    if(m < x)
        return Query(2 * k + 1 , m + 1 , dr , x , y);
    else if(m >= y)
        return Query(2 * k , st , m , x , y);
    else return max(Query(2 * k , st , m , x , m) , Query(2 * k + 1 , m + 1 , dr , m + 1 , y ));
}
inline void Solve()
{
    int op , x , y;
    while(Q -- )
    {
        fin >> op;
        if(op == 0)
        {

            fin >> x >> y;
            fout << Query(1 , 1 , n , x , y) << "\n";
        }
        else
        {
            fin >> x >> y;
            Update(n - 1 + x , y);
        }
    }
}
int main()
{
   Read_Build();
   Solve();
   fin.close();
   fout.close();
    return 0;
}