Pagini recente » Cod sursa (job #204669) | Cod sursa (job #2345372) | Cod sursa (job #3220231) | Cod sursa (job #2495900) | Cod sursa (job #1148268)
#include <fstream>
using namespace std;
const int N = 1 + 1e5;
class MonoAib{
int front[N], back[N], value[N], size;
inline int lsb(const int x){
return x & -x;
}
public:
void init(int n){
size = n;
}
void update(int x, int val){
swap(val, value[x]);
if (value[x] < val){
for (int i = x ; i <= size ; i += lsb(i))
if (back[i] == val)
back[i] = max( value[x], query(i - lsb(i) + 1, i - 1) );
for (int i = x ; i ; i -= lsb(i))
if (front[i] == val)
front[i] = max( value[x], query(i + 1, i + lsb(i) - 1) );
} else {
for (int i = x ; i <= size ; i += lsb(i))
back[i] = max( back[i], value[x] );
for (int i = x ; i ; i -= lsb(i))
front[i] = max( front[i], value[x] );
}
}
int query(int x, int y){
if (y < x)
return 0;
int ans = 0, p;
while (x != y){
p = lsb(x | y);
if (x & p){
ans = max(ans, front[x]);
x += p;
}
if (y & p){
ans = max(ans, back[y]);
y -= p;
}
}
return max(ans, value[x]);
}
};
MonoAib A;
ifstream in("arbint.in");
ofstream out("arbint.out");
int main(){
int n, nrQ, tip, x, y;
in >> n >> nrQ;
A.init(n);
for (int i = 1 ; i <= n ; i++){
in >> x;
A.update(i, x);
}
while (nrQ--){
in >> tip >> x >> y;
if (tip == 1)
A.update(x, y);
else
out << A.query(x, y) << '\n';
}
return 0;
}