Pagini recente » Cod sursa (job #56448) | Cod sursa (job #2582291) | Cod sursa (job #2064670) | Cod sursa (job #37094) | Cod sursa (job #1193800)
#include <fstream>
using namespace std;
const int N = 1 + 2e5, LG = 17;
class Aint{
int aint[2 * N];
inline static int getPos(int n){
return 2 * (n - 1) - __builtin_popcount(n - 1);
}
public:
void update(int x, int val){
aint[ getPos(x) ] = val;
for (int i = 0, step = 1 ; i < LG ; i++, step <<= 1){
if ( x & step )
x += step;
aint[ getPos(x) + i + 1 ] = max( aint[ getPos(x) + i ], aint[ getPos(x - step) + i ] );
}
}
int query(int x, int y){
x--;
int ans = 0, p;
while (x != y){
p = __builtin_ctz( x | y );
if (x & (1 << p)){
ans = max(ans, aint[ getPos(x + (1 << p)) + p ]);
x += 1 << p;
}
if (y & (1 << p)){
ans = max(ans, aint[ getPos(y) + p ]);
y ^= 1 << p;
}
}
return ans;
}
};
Aint A;
int main(){
int n, nrQ, tip, x, y;
ifstream in("arbint.in");
in >> n >> nrQ;
for (int i = 1 ; i <= n ; i++){
in >> x;
A.update(i, x);
}
ofstream out("arbint.out");
while (nrQ--){
in >> tip >> x >> y;
if (tip == 0)
out << A.query(x, y) << '\n';
else
A.update(x, y);
}
out.close();
in.close();
return 0;
}