Cod sursa(job #156608)

Utilizator flo_demonBunau Florin flo_demon Data 12 martie 2008 17:33:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>

#define MAX 100001

int n, m;
int T[4*MAX+4];

void update(int nod, int st, int dr, int a, int b, int val);
int query(int nod, int st, int dr, int a, int b);

int main()
{
    int i1, i2, nr, poz, op;
    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
    {
        fscanf(fin, "%d", &nr);
        update(1, 1, n, i, i, nr);
    }
    for (int i = 0; i < m; ++i)
    {
        fscanf(fin, "%d", &op);
        if (op == 0)
        {
            fscanf(fin, "%d%d", &i1, &i2);
            fprintf(fout, "%d\n", query(1, 1, n, i1, i2));
        }
        else
        {
            fscanf(fin, "%d%d", &poz, &nr);
            update(1, 1, n, poz, poz, nr);
        }
    }
    fclose(fin);
    fclose(fout);
    
    return 0;
}

void update(int nod, int st, int dr, int a, int b, int val)
{
    if (st == dr && st == a && st == b)
        T[nod] = val;
    else
    {
        int mijl = (st + dr) >> 1;
        if (a <= mijl)
            update(2*nod, st, mijl, a, b, val);
        if (b > mijl)
            update(2*nod+1, mijl+1, dr, a, b, val);
        if (T[2*nod] > T[2*nod+1])
            T[nod] = T[2*nod];
        else
            T[nod] = T[2*nod+1];
    }
}

int query(int nod, int st, int dr, int a, int b)
{
    int ret1 = 0, ret2 = 0;
    if (a <= st && dr <= b)
        return T[nod];
    else
    {
        int mijl = (st + dr) >> 1;
        if (a <= mijl)
            ret1 = query(2*nod, st, mijl, a, b);
        if (b > mijl)
            ret2 = query(2*nod+1, mijl+1, dr, a, b);
        if (ret1 > ret2)
            return ret1;
        else
            return ret2;
    }
    return ret1;
}