Cod sursa(job #3325868)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 26 noiembrie 2025 18:47:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <climits>

using namespace std;

#define MAXN 100000

int v[MAXN + 1];
int tree[4 * MAXN + 1];

void build(int nod, int st, int dr){
    if (st == dr){
        tree[nod] = v[st];
    }
    else{
        int mij = (st + dr) / 2;
        build(nod * 2, st, mij);
        build(nod * 2 + 1, mij + 1, dr);
        tree[nod] = max(tree[nod * 2], tree[nod * 2 + 1]);
    }
}

int query(int nod, int st, int dr, int ql, int qr){
    if (qr < st || ql > dr){
        return INT_MIN;
    }
    if (ql <= st && dr <= qr){
        return tree[nod];
    }
    int mij = (st + dr) / 2;
    return max(query(nod * 2, st, mij, ql, qr), query(nod * 2 + 1, mij + 1, dr, ql, qr));
}

void update(int nod, int st, int dr, int poz, int val){
    if (st == dr){
        tree[nod] = val;
    }
    else{
        int mij = (st + dr) / 2;
        if (poz <= mij){
            update(nod * 2, st, mij, poz, val);
        }
        else{
            update(nod * 2 + 1, mij + 1, dr, poz, val);
        }
        tree[nod] = max(tree[nod * 2], tree[nod * 2 + 1]);
    }
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    int N, Q, i, val, X, Y;
    fscanf(fin, "%d%d", &N, &Q);
    for (i = 1; i <= N; i++){
        fscanf(fin, "%d", &v[i]);
    }
    build(1, 1, N);
    for (i = 1; i <= Q; i++){
        fscanf(fin, "%d%d%d", &val, &X, &Y);
        if (val == 0){
            fprintf(fout, "%d\n", query(1, 1, N, X, Y));
        }
        else{
            update(1, 1, N, X, Y);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}