# PBinfo #2091 – Actualizare Interval, Minim Interval – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Se dă un șir de numere asupra căruia se pot face două tipuri de operații: actualizare a unui interval (schimbarea valorii tuturor elementelor aflate între două poziții date) și interogarea unui interval (determinarea celei mai mici valori aflate între două poziții date).

Cerința
Afișați răspunsurile la fiecare interogare.

Date de intrare
Prima linie a fisierului aimi.in conține un număr N, ce reprezintă lungimea șirului dat. Linia a doua, conține, separate prin câte un spațiu elementele șirului dat. Pe linia a treia se află un număr M ce reprezintă numărul de operații ce se efectuează asupra șirului dat. Pe fiecare din următoarele M linii se află descrierea câte unei operații astfel: interogările sub forma 1 A B, cerându-se minimul elementelor aflate între pozițiile A și B inclusiv, sau 2 A B X, semnificând faptul că toate elementele de pe poziții de la A la B inclusiv primesc valoarea X.

Date de ieșire
Fișierul aimi.out conține pe câte o linie răspunsul la căte o operațe de tip 1, în ordinea în care acestea apar în datele de intrare.

Restricții și precizări

1 ≤ N ≤ 100000
1 ≤ M ≤ 100000
1 ≤ A ≤ B ≤ N
elementele șirului dat sunt indexate de la 1
elementele șirului dat precum și valorile X sunt de tip int, pozitive

Exemplu:
aimi.in

5
1 6 4 3 9
3
1 2 4
2 2 3 2
1 2 4
aimi.out

3
2

## Cod sursă C++

```cpp
#include <fstream>
#include <climits>
#define DIM 100010
#define INF INT_MAX
using namespace std;
ifstream fin ("aimi.in");
ofstream fout("aimi.out");
struct nod {
    int value;
    int add;
};
nod A[4*DIM];
int n, m, a, b, t, i, minim, x;
void build(int nod, int st, int dr) {
    if (st == dr) {
        fin>>A[nod].value;
    } else {
        int mid = (st + dr)/2;
        build(2*nod, st, mid);
        build(2*nod+1, mid+1, dr);
        A[nod].value = min(A[2*nod].value, A[2*nod+1].value);
    }
}
void query(int nod, int st, int dr, int a, int b) {
    if (a <= st && dr <= b) {
        minim = min(minim, A[nod].value);
    } else {
        if (A[nod].add == 1) {
            A[2*nod].value = A[nod].value;
            A[2*nod].add = 1;
            A[2*nod+1].value = A[nod].value;
            A[2*nod+1].add = 1;
            A[nod].add = 0;
        }
        int mid = (st + dr)/2;
        if (a <= mid)
            query(2*nod, st, mid, a, b);
        if (b > mid)
            query(2*nod+1, mid+1, dr, a, b);
        A[nod].value = min(A[2*nod].value, A[2*nod+1].value);
    }
}
void update(int nod, int st, int dr, int a, int b, int x) {
    if (a <= st && dr <= b) {
        A[nod].value = x;
        A[nod].add = 1;
    } else {
        if (A[nod].add == 1) {
            A[2*nod].value = A[nod].value;
            A[2*nod].add = 1;
            A[2*nod+1].value = A[nod].value;
            A[2*nod+1].add = 1;
            A[nod].add = 0;
        }
        int mid = (st + dr)/2;
        if (a <= mid)
            update(2*nod, st, mid, a, b, x);
        if (b > mid)
            update(2*nod+1, mid+1, dr, a, b, x);
        A[nod].value = min(A[2*nod].value, A[2*nod+1].value);
    }
}
int main () {
    fin>>n;
    build(1, 1, n);
    fin>>m;
    for (int i=1;i<=m;i++) {
        fin>>t>>a>>b;
        if (t == 1) {
            minim = INF;
            query(1, 1, n, a, b);
            fout<<minim<<"\n";
        } else {
            fin>>x;
            update(1, 1, n, a, b, x);
        }
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2091)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2091/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2091/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
