Cod sursa(job #3124864)

Utilizator Mircea08Tomita Mircea Stefan Mircea08 Data 30 aprilie 2023 13:46:12
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>
typedef struct _Tree {
    struct _Tree *left_son, *right_son;
    int info;
}Tree;
int aux = 1, *v;
inline void init(Tree *T, int left, int right) {
    if (left == right) {
        T -> info = v[aux];
        ++ aux;
    }
    else {
        int middle = (left + right) >> 1;
        T -> left_son = (Tree*)malloc(sizeof(Tree));
        T -> right_son = (Tree*)malloc(sizeof(Tree));
        init(T -> left_son, left, middle);
        init(T -> right_son, middle + 1, right);
        T -> info = std :: min(T -> left_son -> info, T -> right_son -> info);
    }
}
int x, y;
inline void update(Tree *T, int left, int right) {
    if (left == right)
        T -> info = y;
    else {
        int middle = (left + right) >> 1;
        if (x <= middle)
            update(T -> left_son, left, middle);
        else
            update(T -> right_son, middle + 1, right);
        T -> info = std :: min(T -> left_son -> info, T -> right_son -> info);
    }
}
int minn;
inline void query(Tree *T, int left, int right) {
    if (x <= left and right <= y)
        minn = std :: min(minn, T -> info);
    else {
        int middle = (left + right) >> 1;
        if (x <= middle)
            query(T -> left_son, left, middle);
        if (y > middle)
            query(T -> right_son, middle + 1, right);
    }
}
int n, m, i;
char C;
int main() {
    std :: ifstream fin("data.in");
    fin >> n >> m;
    v = (int*)malloc(sizeof(int) * (n + 1));
    for (i = 1; i <= n; ++ i)
        fin >> v[i];
    Tree *T = (Tree*)malloc(sizeof(Tree));
    init(T, 1, n);
    free(v);
    std :: ofstream fout("data.out");
    while (m) {
        -- m;
        fin >> C >> x >> y;
        if (C == '1')
            update(T, 1, n);
        else {
            minn = 2000000000;
            query(T, 1, n);
            fout << minn << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}