Cod sursa(job #144047)

Utilizator damaDamaschin Mihai dama Data 27 februarie 2008 09:36:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <stdio.h>

const int nm = 100001;
const int inf = 1 << 30;

int v[nm], arb[3 * nm], n, m;

void update(int, int, int, int, int);
int query(int, int, int, int, int);
void init(int, int, int);

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

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

    int i, t, a, b, res;

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

    for(i = 1; i <= n; ++i)
    {
        scanf("%d", &v[i]);
    }

    init(1, 1, n);



    for(i = 1; i <= m; ++i)
    {
        scanf("%d %d %d", &t, &a, &b);
        if(t == 0)
        {
            res = query(1, 1, n, a, b);
            printf("%d\n", res);
        }
        else
        {
            update(1, 1, n, a, b);
        }
    }

    return 0;
}

void update(int nod, int st, int dr, int pos, int val)
{
    if(st == dr)
    {
        arb[nod] = val;
    }
    else
    {
        int fs = 2 * nod, fd = fs + 1, mid = (st + dr) / 2;
        if(pos <= mid)
        {
            update(fs, st, mid, pos, val);
        }
        else
        {
            update(fd, mid + 1, dr, pos, val);
        }
        arb[nod] = max(arb[fd], arb[fs]);
    }
}

int query(int nod, int st, int dr, int a, int b)
{
    if(st == a && dr == b)
    {
        return arb[nod];
    }
    int fs = 2 * nod, fd = fs + 1, mid = (st + dr) / 2;

    if(b <= mid)
    {
        return query(fs, st, mid, a, b);
    }
    if(a > mid)
    {
        return query(fd, mid + 1, dr, a, b);
    }
    else
    {
        return max(query(fs, st, mid, a, mid), query(fd, mid + 1, dr, mid + 1, b));
    }
}

void init(int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod] = v[st];
    }
    else
    {
        int fs = 2 * nod, fd = fs + 1, mid = (st + dr) / 2;
        init(fs, st, mid);
        init(fd, mid + 1, dr);
        arb[nod] = max(arb[fs], arb[fd]);
    }
}