Cod sursa(job #2063668)

Utilizator anisca22Ana Baltaretu anisca22 Data 11 noiembrie 2017 12:40:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define NMAX 100005

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

int N, M, mx;
int ait[4 * NMAX], v[NMAX];

void build(int poz, int st, int dr)
{
    if (st == dr)
    {
        ait[poz] = v[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(poz * 2, st, mij);
    build(poz * 2 + 1, mij + 1, dr);
    ait[poz] = max(ait[2 * poz], ait[2 * poz + 1]);
}

void upd(int poz, int act, int st, int dr)
{
    if (act > dr || act < st)
        return;
    if (st == dr && st == act)
    {
        ait[poz] = v[st];
        return;
    }
    int mij = (st + dr) / 2;
    upd(poz * 2, act, st, mij);
    upd(poz * 2 + 1, act, mij + 1, dr);
    ait[poz] = max(ait[2 * poz], ait[2 * poz + 1]);
}

void query(int poz, int lft, int rit, int st, int dr)
{
    if (lft <= st && dr <= rit)
    {
        mx = max(mx, ait[poz]);
        return;
    }
    if (dr < lft || st > rit)
        return;
    int mij = (st + dr) / 2;
    query(poz * 2, lft, rit, st, mij);
    query(poz * 2 + 1, lft, rit, mij + 1, dr);
}
int main()
{
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
        fin >> v[i];
    build(1, 1, N);
    while (M--)
    {
        int op, a, b;
        fin >> op >> a >> b;
        if (op == 1)
        {
            v[a] = b;
            upd(1, a, 1, N);
        }
        else if (op == 0)
        {
            mx = 0;
            query(1, a, b, 1, N);
            fout << mx << "\n";
        }

    }

}