Cod sursa(job #1675869)

Utilizator CraiuAndrei Craiu Craiu Data 5 aprilie 2016 16:54:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, k, N;
int aint[300000];

void Update(int p, int x)
{
    int t, mx;
    p = p + N - 1;
    aint[p] = x;
    while(p > 0)
    {
        t = p / 2;
        mx = max(aint[2 * t], aint[2 * t + 1]);
        aint[t] = mx;
        p = t;
    }

}

int Query(int nod, int x, int y, int st, int dr)
{
    int m;
    if(st == x && dr == y) return aint[nod];
    else
    {
        m = (st + dr) / 2;
        if(y <= m) return Query(nod * 2, x, y, st, m);
        else if(m + 1 <= x) return Query(nod * 2 + 1, x, y, m + 1, dr);
        else return max(Query(nod * 2, x, m, st, m), Query(nod * 2 + 1, m + 1, y, m + 1, dr));
    }
}

int main()
{
    int i, tip, x, y, j;
    fin >> n >> k;
    N = 1;
    while(N < n)
        N *= 2;
    j = N;
    for(i = 1; i <= n; i++)
    {
        fin >> x;
        aint[j++] = x;
    }
    for(i = N - 1; i >= 1; i--)
        aint[i] = max(aint[2 * i], aint[2 * i + 1]);
    for(i = 1; i <= k; i++)
    {
        fin >> tip >> x >> y;
        if(tip == 0) fout << Query(1, x, y, 1, N) << "\n";
        else Update(x, y);
    }
    return 0;
}