Cod sursa(job #1610651)

Utilizator DiClauDan Claudiu DiClau Data 23 februarie 2016 17:57:00
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<stdio.h>
using namespace std;
const int N = 200005, INF = 1000000000;
int v[N], poz, val;
int maxim (int a, int b)
{
    return a < b ? b : a;
}
void update (int p, int st, int dr)
{
    if (st == dr)
    {
        v[p] = val;
        return;
    }
    int m = (st + dr) / 2;
    if (poz <= m)
        update (p * 2, st, m);
    else
        update (p * 2 + 1, m + 1, dr);
    v[p] = maxim (v[p * 2], v[p * 2 + 1]);

}
int a, b;
int query (int p, int st, int dr)
{
    if (a <= st && dr <= b)
        return v[p];
    int m = (st + dr) / 2, m1 = -INF, m2 = -INF;
    if (a <= m)
        m1 = query (2 * p, st, m);
    if (b > m)
        m2 = query (2 * p + 1, m + 1, dr);
    return maxim (m1, m2);
}
int main ()
{
    FILE *in, *out;
    in = fopen ("arbint.in", "r");
    out = fopen ("arbint.out", "w");
    int n, m;
    fscanf (in, "%d%d", &n, &m);
    int i;
    for (i = 1; i <= n; i++)
    {
        fscanf (in, "%d", &val);
        poz = i;
        update (1, 1, n);
    }
    int task;
    for (i = 1; i <= m; i++)
    {
        fscanf (in, "%d", &task);
        if (task == 0)
        {
            fscanf (in, "%d%d", &a, &b);
            fprintf (out, "%d\n", query (1, 1, n));
        }
        else
        {
            fscanf (in, "%d%d", &poz, &val);
            update (1, 1, n);
        }
    }
    return 0;
}