Pagini recente » Cod sursa (job #143046) | Cod sursa (job #2024446) | Cod sursa (job #1383146) | Cod sursa (job #2934852) | Cod sursa (job #1148433)
#include <fstream>
using namespace std;
const int N = 1 + 1e5, obsolete = -1;
class MonoAib{
int front[N], back[N], value[N], size;
inline int lsb(const int x){
return x & -x;
}
inline int requestBack(int x){
if ( back[x] == obsolete )
back[x] = max( value[x], query(x - lsb(x) + 1, x - 1) );
return back[x];
}
inline int requestFront(int x){
if ( front[x] == obsolete )
front[x] = max( value[x], query(x + 1, x - lsb(x) - 1) );
return front[x];
}
public:
void init(int n){
size = n;
}
void update(int x, int val){
if ( val < value[x] ){
for (int i = x ; i <= size ; i += lsb(i))
if ( back[i] == value[x] )
back[i] = obsolete;
for (int i = x ; i ; i -= lsb(i))
if ( front[i] == value[x] )
front[i] = obsolete;
} else {
for (int i = x ; i <= size ; i += lsb(i))
back[i] = max( back[i], val );
for (int i = x ; i ; i -= lsb(i))
front[i] = max( front[i], val );
}
value[x] = val;
}
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, requestFront(x) );
x += p;
}
if (y & p){
ans = max(ans, requestBack(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;
}