Pagini recente » Cod sursa (job #2166113) | Cod sursa (job #789124) | Cod sursa (job #2946224) | Cod sursa (job #2876361) | Cod sursa (job #1613696)
# include <fstream>
# define MAXN 100010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Arb[4*MAXN], Max, n, m, a, b, t, x, i;
void update(int nod, int st, int dr) {
if (st == dr) // daca am ajuns in frunza (interval elementar)
Arb[nod] = b; // il actualizez cu valoarea citita
else {
int mid = st + (dr - st) / 2;
if (a <= mid)
update(nod*2, st, mid); // actualizez fiu stanga cu intervalul [st, mid]
else
update(nod*2+1, mid+1, dr); // actualizez fiu dreapta cu intervalul [mid+1, dr]
Arb[nod] = max(Arb[nod*2], Arb[nod*2+1]); // calculez informatia nodului curent, in functie de cei doi fii ai sai
}
}
void query(int nod, int st, int dr) {
if (a <= st && b >= dr) // daca ma pozitionez pe un interval [st, dr] mai mic decat intervalul [a, b]
Max = max(Max, Arb[nod]); // calculez informatia ceruta
else {
int mid = st + (dr - st) / 2;
if (a <= mid)
query(nod*2, st, mid);
else
query(nod*2+1, mid+1, dr);
}
}
int main() {
fin >> n >> m;
for (i=1; i<=n; ++i) {
fin >> x;
a = i; b = x;
update(1, 1, n);
}
for (i=1; i<=m; ++i) {
fin >> t >> a >> b;
if (!t) {
Max = -1;
query(1, 1, n);
fout << Max << "\n";
continue;
}
if (t) {
update(1, 1, n);
continue;
}
}
return 0;
}