Cod sursa(job #3363362)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 16 august 2026 21:34:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 100000;
const int MAXP = 131072;
int aint[2 * MAXP], v[MAXN + 1];
int rez;

int maxim(int a, int b) {
    return a > b ? a : b;
}
void build(int nod, int st, int dr) {
    int mid;
    if (st == dr) {
        aint[nod] = v[st];
    } else {
        mid = (st + dr) / 2;
        build(2 * nod, st, mid);
        build(2 * nod + 1, mid + 1, dr);
        aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
    }
}
void update(int nod, int st, int dr, int p) {
    int mid;
    if (st == dr) {
        aint[nod] = v[p];
    } else {
        mid = (st + dr) / 2;
        if (p <= mid) {
            update(2 * nod, st, mid, p);
        } else {
            update(2 * nod + 1, mid + 1, dr, p);
        }
        aint[nod] = maxim(aint[2 * nod], aint[2 * nod + 1]);
    }
}
void query(int nod, int st, int dr, int x, int y) {
    int mid;
    if (x <= st && y >= dr) {
        rez = maxim(rez, aint[nod]);
    } else {
        mid = (st + dr) / 2;
        if (x <= mid) {
            query(2 * nod, st, mid, x, y);
        }
        if (y > mid) {
            query(2 * nod + 1, mid + 1, dr, x, y);
        }
    }
}
int main()
{
    FILE *fin, *fout;
    int n, m, i, cer, st, dr;
    fin = fopen("arbint.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for (i = 1; i <= n; i++) {
        fscanf(fin, "%d", &v[i]);
    }
    build(1, 1, n);
    fout = fopen("arbint.out", "w");
    for (i = 0; i < m; i++) {
        fscanf(fin, "%d%d%d", &cer, &st, &dr);
        if (cer == 0) {
            rez = 0;
            query(1, 1, n, st, dr);
            fprintf(fout, "%d\n", rez);
        } else {
            v[st] = dr;
            update(1, 1, n, st);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}