Cod sursa(job #1348279)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 19 februarie 2015 16:55:16
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>

using namespace std;
#define MAX 100000

int v[2*MAX+5], n, m, maxim;
void update(int nod, int st, int dr, int poz, int val);
void query(int nod, int st, int dr, int x, int y);
int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int i, a, b, cod, x;
    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&x);
        update(1, 1, n, i, x);
    }

    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d", &cod, &a, &b);
        if(!cod)
        {
            maxim = 0;
            query(1, 1, n, a, b);
            printf("%d\n", maxim);
        }
        else
            update(1, 1, n, a, b);
    }
    return 0;
}
void update(int nod, int st, int dr, int poz, int val)
{
    int med;
    if(st == dr)
    {
        v[nod] = val;
        return;
    }
    med = (st+dr)>>1;
    if(poz <= med)
        update(nod*2, st, med, poz, val);
    else
        update(nod*2+1, med+1, dr, poz, val);
    v[nod] = max(v[nod*2], v[nod*2+1]);
}
void query(int nod, int st, int dr, int x, int y)
{
    int med;
    if(x<=st and dr<=y)
    {
        maxim = max(maxim, v[nod]);
        return;
    }
    med = (st+dr)>>1;
    if(x <= med)
        query(nod*2, st, med, x, y);
    if(y >= med+1)
        query(nod*2+1, med+1, dr, x, y);
}