Pagini recente » Cod sursa (job #1606947) | Cod sursa (job #2721050) | Cod sursa (job #694227) | Cod sursa (job #2121356) | Cod sursa (job #1129682)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
vector<int> v, aib;
inline int lsb(int x) {
return (x & (-x));
}
int query(int a, int b) {
int ans = -1;
if(a > b)
return ans;
while(b != a) {
if(b - lsb(b) >= a) {
ans = max(ans, aib[b]);
b -= lsb(b);
} else {
ans = max(ans, v[b]);
b--;
}
}
ans = max(ans, v[a]);
return ans;
}
void update(int poz, int value) {
v[poz] = value;
//int init = poz;
while(poz <= n) {
int lf = query(poz - lsb(poz) + 1, poz - 1);
aib[poz] = max(lf, v[poz]);
poz += lsb(poz);
}
}
int main() {
#ifdef INFOARENA
ifstream cin("arbint.in");
ofstream cout("arbint.out");
#endif
cin >> n >> m;
v = vector<int> (n + 1, 0);
aib = vector<int> (n + 1, -1);
for(int i = 1; i <= n; ++i) {
cin >> v[i];
update(i, v[i]);
}
for(int i = 1; i <= m; ++i) {
int type; cin >> type;
int a, b; cin >> a >> b;
if(type == 0)
cout << query(a, b) << "\n";
else
update(a, b);
}
}