Cod sursa(job #3358386)

Utilizator Crisan_AndreiCrisan Paul-Andrei Crisan_Andrei Data 16 iunie 2026 16:31:47
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#define MAX 100005
int A[MAX];
int arbore[4 * MAX];
int maxim(int a, int b)
{
    if(a > b)
        return a;
    return b;
}

void initial(int nod, int st, int dr)
{
    if (st == dr)
    {
        arbore[nod] = A[st];
        return;
    }
    int mij = st + (dr - st) / 2;
    int st1 = 2 * nod;
    int dr1 = 2 * nod + 1;
    initial(st1, st, mij);
    initial(dr1, mij + 1, dr);
    arbore[nod] = maxim(arbore[st1], arbore[dr1]);
}

void schimbare(int nod, int st, int dr, int pos, int val)
{
    if (st == dr)
    {
        arbore[nod] = val;
        return;
    }
    int mij = st + (dr - st) / 2;
    int st1 = 2 * nod;
    int dr1 = 2 * nod + 1;
    if (pos <= mij)
        schimbare(st1, st, mij, pos, val);
    else
        schimbare(dr1, mij + 1, dr, pos, val);
    arbore[nod] = maxim(arbore[st1], arbore[dr1]);
}

int q(int nod, int st, int dr, int q_st, int q_dr)
{
    if (q_st <= st && dr <= q_dr)
        return arbore[nod];
    if (q_dr < st || dr < q_st)
        return -1;
    int mij = st + (dr - st) / 2;
    int st1 = 2 * nod;
    int dr1 = 2 * nod + 1;
    int maxim_st = q(st1, st, mij, q_st, q_dr);
    int maxim_dr = q(dr1, mij + 1, dr, q_st, q_dr);
    return maxim(maxim_st, maxim_dr);
}

int main(void)
{
    int n, m;
    FILE *in = fopen("arbint.in", "r");
    FILE *out = fopen("arbint.out", "w");
    fscanf(in, "%d %d", &n, &m);
    for(int i = 1; i <= n; i++)
        fscanf(in, "%d", &A[i]);
    initial(1, 1, n);
    for(int i = 0; i < m; i++)
    {
        int t, a, b;
        fscanf(in, "%d %d %d", &t, &a, &b);
        if(t == 0)
        {
            int maxi = q(1, 1, n, a, b);
            fprintf(out, "%d\n", maxi);
        }
        else
            schimbare(1, 1, n, a, b);
    }
    return 0;
}