Cod sursa(job #2197283)

Utilizator calinfloreaCalin Florea calinflorea Data 21 aprilie 2018 17:02:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define NMax 270006

using namespace std;

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

int a[NMax];
int n, m;

int Query(int nod, int x, int y, int st, int dr)
{
    if(st == x && dr == y)
        return a[nod];

    int m = (st + dr) / 2;

    if(y <= m)
        return Query(2 * nod, x, y, st, m);
    if(m + 1 <= x)
        return Query(2 * nod + 1, x, y, m + 1, dr);
    return max(Query(2 * nod, x, m, st, m),Query(2 * nod + 1, m + 1, y, m + 1, dr));
}

inline void Update(int p, int x)
{
    p = p + n - 1;
    a[p] = x;

    while(p > 0)
    {
        int t = p / 2;
        int mx = max(a[2 * t], a[2 * t + 1]);
        a[t] = mx;
        p = t;
    }
}
int main()
{
    int x, y, op, j, val, i;

    fin >> n >> m;
    int N=1;

    while(N < n)
        N *= 2;

    j = N;

    for(i = 1; i <= n; i++)
    {
        fin >> val;
        a[j++] = val;
    }

    n = N;

    for(int i = n - 1; i >= 1; i--)
        a[i] = max(a[2 * i], a[2 * i + 1]);

    for(int i = 1; i <= m; i++)
    {
        fin >> op >> x >> y;
        if(op == 1)
            Update(x, y);
        else
            fout << Query(1, x, y, 1, n) << "\n";
    }

    return 0;
}