Pagini recente » Cod sursa (job #2359276) | Cod sursa (job #1989682) | Cod sursa (job #601508) | Cod sursa (job #617500) | Cod sursa (job #2618282)
#include <bits/stdc++.h>
#define dim 100005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int tree[4 * dim]; // arborele
int n, x; // numarul de valori - citire
int Q; // numar de query-uri
int T, A, B; // tipul de interogare, capetele interogarii
int start, finish; // Query
int maxx; // Query - det max
int pos, val; // Update
void Update (int nod, int left, int right) {
if (left == right) {
tree[nod] = val; // completam frunza
return;
}
int mid = (left + right) / 2;
if (pos <= mid) Update (2 * nod, left, mid);
else Update (2 * nod + 1, mid + 1, right);
tree[nod] = max (tree[2 * nod], tree[2 * nod + 1]); // actualizam restul elementelor in maniera bottom-up
}
void Query (int nod, int left, int right) {
if (start <= left && right <= finish) {
if (maxx < tree[nod]) maxx = tree[nod]; // intervalul curent se afla in interiorul intervalului interogat
return;
}
int mid = (left + right) / 2;
if (start <= mid) Query (2 * nod, left, mid);
if (mid < finish) Query (2 * nod + 1, mid + 1, right);
}
int main() {
fin >> n >> Q;
for (int i = 1; i <= n; i ++) {
fin >> x;
pos = i, val = x;
Update (1, 1, n);
}
while (Q --) {
fin >> T >> A >> B;
if (T == 0) {
maxx = -1;
start = A, finish = B;
Query (1, 1, n);
fout << maxx << '\n';
} else {
pos = A, val = B;
Update (1, 1, n);
}
}
fin.close ();
fout.close ();
return 0;
}