Cod sursa(job #612485)

Utilizator elfusFlorin Chirica elfus Data 8 septembrie 2011 00:13:13
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>
#define HMAX 1 << 17
#define max(a,b) (a > b ? a : b)

int tree[HMAX];

void Upgrade(int node, int first, int second, int pos, int value)
{
    int med;

    if(first == second)
    {
        tree[node] = value;
        return ;
    }

    med = (first + second) >> 1;
    if(pos <= med)
        Upgrade(node << 1, first, med, pos, value);
    else
        Upgrade((node << 1) + 1, med + 1, second, pos, value);

    tree[node] = max(tree[node << 1], tree[(node << 1) + 1]);
}

int Query(int node, int first, int second, int st, int dr)
{
    int med, aux1 = 0, aux2 = 0;

    if(st <= first && second <= dr)
        return tree[node];

    med = (first + second) >> 1;
    if(st <= med)
        aux1 = Query(node << 1, first, med, st, dr);
    if(med < dr)
        aux2 = Query((node << 1) + 1, med + 1, second, st, dr);

    return max(aux1, aux2);
}

int main()
{
    int N, M, x, i, tip, y;

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

    scanf("%d%d", &N, &M);
    for(i = 1; i <= N; i ++)
    {
        scanf("%d", &x);
        Upgrade(1, 1, N, i, x);
    }

    while(M --)
    {
        scanf("%d%d%d", &tip, &x, &y);
        if(tip == 0)
            printf("%d\n", Query(1, 1, N, x, y));
        if(tip == 1)
            Upgrade(1, 1, N, x, y);
    }

    return 0;
}