Pagini recente » Cod sursa (job #3367115) | Cod sursa (job #3364784) | Borderou de evaluare (job #3365395) | Cod sursa (job #3365508) | Cod sursa (job #3365282)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
const int SQRT = 317;
int a[NMAX + 1];
int b[SQRT + 1];
int sz;
//O(sqrt(n))
void update(int pos, int val) {
a[pos] = val; //actualizam valoarea
int p = pos / sz; //vedem in ce block se afla
if(pos % sz > 0) {
p++;
}
b[p] = 0;
//trecem prin toate elementele blocului si vedem daca se schimba maximul
for(int i = (p - 1) * sz + 1; i <= p * sz; i++) {
b[p] = max(b[p], a[i]);
}
}
//O(sqrt(n))
int query(int x, int y) {
int sol = 0;
//parcurgem primul block incomplet
while(x <= y && x % sz != 1) {
sol = max(sol, a[x]);
x++;
}
//parcurg block-urile complete
while(x <= y && x + sz - 1 <= y) {
int p = x / sz; //vedem in ce block se afla
if(x % sz > 0) {
p++;
}
sol = max(sol, b[p]);
x += sz;
}
//parcurgem ultimul block incomplet
while(x <= y) {
sol = max(sol, a[x]);
x++;
}
return sol;
}
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, q;
cin >> n >> q;
sz = sqrt(n);
for(int i = 1; i <= n; i++) {
cin >> a[i];
int p = i / sz;
if(i % sz > 0) {
p++;
}
b[p] = max(b[p], a[i]);
}
for(int i = 1; i <= q; i++) {
int op, x, y;
cin >> op >> x >> y;
if(op == 0) {
cout << query(x, y) << '\n';
} else {
update(x, y);
}
}
}