Cod sursa(job #1486847)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 15 septembrie 2015 17:34:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
#define father(x) ((x) >> 1)
#define left_son(x) ((x) << 1)
#define right_son(x) (((x) << 1) + 1)

using namespace std;


int max_Aib[400005];
bool op;
int n, m, maxi;

void update (int left, int right, int val, int nod, int fin)
{
    if (left == right)
    {
        max_Aib[nod] = val;
        return;
    }
    int mij = (left + right) >> 1;
    if (fin <= mij) update(left, mij, val, left_son(nod), fin);
    else update(mij + 1, right, val, right_son(nod), fin);
    max_Aib[nod] = max(max_Aib[left_son(nod)], max_Aib[right_son(nod)]);
}

void query(int left, int right, int start, int finish, int nod)
{
    if (left >= start && right <= finish)
    {
        maxi = max(maxi, max_Aib[nod]);
        return;
    }
    int mij = (left + right) >> 1;
    if (mij >= start) query(left, mij, start, finish, left_son(nod));
    if (mij < finish) query(mij + 1, right, start, finish, right_son(nod));
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1, x, poz; i <= n; i++)
    {
        scanf("%d", &x);
        poz = i;
        update(1, n, x, 1, poz);
    }
    for (int i = 1, a, b; i <= m; i++)
    {
        scanf("%d %d %d", &op, &a, &b);
        if (!op)
        {
            maxi = -1;
            query(1, n, a, b, 1);
            printf("%d\n", maxi);
        }
        else
        {
            update(1, n, b, 1, a);
        }
    }
    return 0;
}