Pagini recente » Cod sursa (job #2581418) | Cod sursa (job #3205258) | Cod sursa (job #2738049) | Cod sursa (job #143727) | Cod sursa (job #1631247)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("arbint.in");
ofstream os("arbint.out");
class St {
public :
St(const vector<int> &val)
{
for (N = 1; N < int(val.size()); N <<= 1);
tree = vector<int>(2 * N, 0);
for (size_t i = 0; i < val.size(); ++i)
tree[N + i] = val[i];
for (int x = N - 1; x > 0; --x)
tree[x] = max(tree[2 * x], tree[2 * x + 1]);
}
void Update(int pos, const int val)
{
tree[pos += N] = val;
for (pos >>= 1; pos > 0 ; pos >>= 1)
tree[pos] = max(tree[pos * 2], tree[2 * pos + 1]);
}
int Query(int l, int r) const
{
l += N;
r += N;
int vmax = 0;
while ( l <= r )
{
vmax = max(vmax, max(tree[l], tree[r]));
l = (l + 1) / 2;
r = (r - 1) / 2;
}
return vmax;
}
private :
int N;
vector<int> tree;
};
int main()
{
int n, m;
is >> n >> m;
vector<int> v;
int x;
for ( int i = 1; i <= n; ++i )
{
is >> x;
v.push_back(x);
}
St tr(v);
int a, b;
for ( int i = 1; i <= m; ++i )
{
is >> x >> a >> b;
--a, --b;
switch ( x )
{
case 0 :
os << tr.Query(a, b) << '\n';
break;
case 1 :
tr.Update(a, b);
break;
}
}
is.close();
os.close();
return 0;
}