Cod sursa(job #2175936)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 16 martie 2018 20:00:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>

using namespace std;

const int NMAX = 100000;

int n, m;
int arb[4 * NMAX + 1];

int ma(int a, int b)
{
    if(a > b)
    {
        return a;
    }
    return b;
}

void update(int nod, int st, int dr, int pos, int val)
{
    if(st == dr && st == pos)
    {
        arb[nod] = val;
        return;
    }

    int mij = (st + dr) >> 1;
    if(pos <= mij)
    {
        update(nod << 1, st, mij, pos, val);
    }
    else
    {
        update((nod << 1) + 1, mij + 1, dr, pos, val);
    }

    arb[nod] = ma(arb[nod << 1], arb[(nod << 1) + 1]);
}

int query(int nod, int st, int dr, int l, int r)
{
    if(l <= st && dr <= r)
    {
        return arb[nod];
    }

    int mij = (st + dr) >> 1;

    if(r <= mij)
    {
        return query(nod << 1, st, mij, l, r);
    }
    else if(mij + 1 <= l)
    {
        return query((nod << 1) + 1, mij + 1, dr, l, r);
    }
    else
    {
        return ma(query(nod << 1, st, mij, l, r), query((nod << 1) + 1, mij + 1, dr, l, r));
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d %d", &n, &m);

    int t;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &t);
        update(1, 1, n, i, t);
    }

    int type, a , b;
    for(int i = 1; i <= m; i++)
    {
        scanf("%d %d %d", &type, &a, &b);

        if(type == 1)
        {
            update(1, 1, n, a, b);
        }
        else
        {
            if(a > b)
            {
                a ^= b ^= a ^= b;
            }
            printf("%d\n", query(1, 1, n, a, b));
        }
    }
}