Pagini recente » Cod sursa (job #2889139) | Cod sursa (job #669081) | Cod sursa (job #400448) | Cod sursa (job #779196) | Cod sursa (job #1613759)
# include <fstream>
# define MAXN 100010
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Arb[4*MAXN], Max, n, m, t, x, a, b, i;
int query(int nod, int st, int dr) {
if (a <= st && b >= dr) // [st, dr] este inclus in [a, b]
return Arb[nod]; // returnez informatia ceruta
int mid = st + (dr - st) / 2;
int x1, x2;
x1 = x2 = 0;
if (a <= mid)
x1 = query(nod<<1, st, mid); // fiu stanga
if (mid < b)
x2 = query((nod<<1)+1, mid+1, dr); // fiu dreapta
return max(x1, x2);
}
void update(int nod, int st, int dr) {
if (st >= a && dr <= a) // 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<<1, st, mid); // fiu stanga
else
update((nod<<1)+1, mid+1, dr); // fiu dreapta
Arb[nod] = max(Arb[nod*2], Arb[nod*2+1]); // calculez informatia nodului curent, in functie de cei doi fii ai sai
}
}
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 == 0)
fout << query(1, 1, n) << "\n";
else
update(1, 1, n);
}
return 0;
}