Pagini recente » Cod sursa (job #2091232) | Cod sursa (job #617544) | Cod sursa (job #88967) | Cod sursa (job #602309) | Cod sursa (job #2435853)
#include <bits/stdc++.h>
using namespace std;
class ArbInt
{
public:
ArbInt(vector<int> &vals)
{
for (size = 1; size < int(vals.size()); size <<= 1)
;
tree = vector<int>(2 * size, 0);
for (int i = 0; i < vals.size(); i++)
tree[size + i] = vals[i];
for (int i = size - 1; i > 0; i--)
tree[i] = max(tree[2 * i], tree[2 * i + 1]);
}
void Update(int pos, int val)
{
pos += size;
tree[pos] = val;
for (pos >>= 1; pos > 0; pos >>= 1)
tree[pos] = max(tree[2 * pos], tree[2 * pos + 1]);
}
int Query(int l, int r) const
{
l += size;
r += size;
int max_val = 0;
while (l <= r)
{
max_val = max(max_val, max(tree[l], tree[r]));
l = (l + 1) / 2;
r = (r - 1) / 2;
}
return max_val;
}
private:
int size;
vector<int> tree;
};
int main()
{
ifstream is("arbint.in");
ofstream os("arbint.out");
int n, m;
is >> n >> m;
vector<int> vals;
for (int x, i = 0; i < n; i++)
{
is >> x;
vals.push_back(x);
}
ArbInt tree(vals);
for (int op, x, y, i = 0; i < m; i++)
{
is >> op >> x >> y;
switch (op)
{
case 0:
os << tree.Query(x - 1, y - 1) << '\n';
break;
case 1:
tree.Update(x - 1, y);
break;
}
}
is.close();
os.close();
return 0;
}