Cod sursa(job #3358102)

Utilizator titus.ticusanTitusTicusan titus.ticusan Data 14 iunie 2026 17:18:45
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <stdio.h>

#define MAXN 100005

int a[MAXN];
int seg[4 * MAXN];

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

void build(int node, int l, int r)
{
    if (l == r)
    {
        seg[node] = a[l];
        return;
    }

    int mid = (l + r) / 2;

    build(2 * node, l, mid);
    build(2 * node + 1, mid + 1, r);

    seg[node] = max(seg[2 * node], seg[2 * node + 1]);
}

void update(int node, int l, int r, int pos, int val)
{
    if (l == r)
    {
        seg[node] = val;
        return;
    }

    int mid = (l + r) / 2;

    if (pos <= mid)
        update(2 * node, l, mid, pos, val);
    else
        update(2 * node + 1, mid + 1, r, pos, val);

    seg[node] = max(seg[2 * node], seg[2 * node + 1]);
}

int query(int node, int l, int r, int ql, int qr)
{
    if (ql <= l && r <= qr)
        return seg[node];

    if (r < ql || l > qr)
        return 0;

    int mid = (l + r) / 2;

    return max(
        query(2 * node, l, mid, ql, qr),
        query(2 * node + 1, mid + 1, r, ql, qr));
}

int main()
{
    FILE *fin = fopen("arbint.in", "r");
    FILE *fout = fopen("arbint.out", "w");

    int N, M;
    fscanf(fin, "%d %d", &N, &M);

    for (int i = 1; i <= N; i++)
        fscanf(fin, "%d", &a[i]);

    build(1, 1, N);

    while (M--)
    {
        int type, x, y;
        fscanf(fin, "%d %d %d", &type, &x, &y);

        if (type == 0)
        {
            fprintf(fout, "%d\n", query(1, 1, N, x, y));
        }
        else
        {
            update(1, 1, N, x, y);
        }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}