Cod sursa(job #2802152)

Utilizator Ricardo03Petrovici Ricardo Ricardo03 Data 17 noiembrie 2021 17:21:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
int a[4 * NMAX], v[NMAX], n, i, m, t, x, y;
void build(int st, int dr, int nod)
{
    if(st == dr) a[nod] = v[st];
    else
    {
        int mij = (st + dr) / 2;
        build(st, mij, nod * 2);
        build(mij + 1, dr, nod * 2 + 1);
        a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
    }
}
int querry(int st, int dr, int nod, int l, int r)
{
    if(l > r) return INT_MIN;
    if(l == st && r == dr) return a[nod];
    int mij = (st + dr) / 2;
    return max(querry(st, mij, nod * 2, l, min(r, mij)), querry(mij + 1, dr, nod * 2 + 1, max(l, mij + 1), r));
}
void update(int st, int dr, int nod, int poz, int val)
{
    if(st == dr && poz == dr) a[nod] = val;
    else if(poz >= st && poz <= dr)
    {
        int mij = (st + dr) / 2;
        update(st, mij, nod * 2, poz, val);
        update(mij + 1, dr, nod * 2 + 1, poz, val);
        a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
    }
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f >> n >> m;
    for(i = 1; i <= n; i++)
        f >> v[i];
    build(1, n, 1);
    for(i = 1; i <= m; i++)
    {
        f >> t;
        if(t == 0)
        {
            f >> x >> y;
            g << querry(1, n, 1, x, y) << "\n";
        }
        if(t == 1)
        {
            f >> x >> y;
            update(1, n, 1, x, y);
        }
    }
    return 0;
}