Cod sursa(job #1965677)

Utilizator DiClauDan Claudiu DiClau Data 14 aprilie 2017 15:53:30
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>
using namespace std;
const int N = 200005;
int v[N], val, x;
int maxim (int a, int b)
{
    return a < b ? b : a;
}
void actualizare (int st, int dr, int p)
{
    if (st == dr)
    {
        v[p] = val;
        return;
    }
    int jum = (dr + st) >> 1;
    if (x <= jum)
        actualizare (st, jum, p * 2);
    else
        actualizare (jum + 1, dr, p * 2 + 1);
    v[p] = maxim (v[p * 2], v[p * 2 + 1]);
}
int a, b;
int interog (int st, int dr, int p)
{
    if (a <= st && b >= dr)
        return v[p];
    int jum = (st + dr) >> 1, sol = -1;
    if (a <= jum && p * 2 < N)
        sol = maxim (-1, interog (st, jum, p * 2));
    if (b > jum && p * 2 + 1 < N)
        sol = maxim (sol, interog (jum + 1, dr, p * 2 + 1));
    return sol;
}
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);
        x = i;
        actualizare (1, n, 1);
    }
    int cerinta;
    for (i = 1; i <= m; i++)
    {
        fscanf (in, "%d", &cerinta);
        if (cerinta == 0)
        {
            fscanf (in, "%d%d", &a, &b);
            fprintf (out, "%d\n", interog (1, n, 1));
        }
        else
        {
            fscanf (in, "%d%d", &x, &val);
            actualizare(1, n, 1);
        }
    }
    return 0;
}