Pagini recente » Cod sursa (job #882175) | Cod sursa (job #975454) | Cod sursa (job #547773) | Cod sursa (job #583835) | Cod sursa (job #3310334)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> buildTree(int n, const vector<int>& a)
{
int N = 1;
while (N < n)
N <<= 1;
vector<int> tree(2 * N);
tree[0] = N;
for (int i = 0; i < n; ++i)
{
tree[N + i] = a[i];
}
for (int i = N + n; i <= 2 * N - 1; ++i)
tree[i] = -1e9;
for (int i = N - 1; i > 0; --i)
{
tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
}
return tree;
}
void updatePoint(vector<int>& tree, int pos, int val)
{
int i = tree[0] + pos;
tree[i] = val;
i /= 2;
while (i >= 1)
{
tree[i] = max(tree[i * 2], tree[i * 2 + 1]);
i /= 2;
}
}
int queryMax(const vector<int>& tree, int l, int r)
{
int N = tree[0];
l += N;
r += N;
int maxl = -1e9;
int maxr = -1e9;
while (l <= r)
{
if (l & 1) { maxl = max(maxl, tree[l]); ++l; }
if (!(r & 1)) { maxr = max(maxr, tree[r]); r--; }
l >>= 1;
r >>= 1;
}
return max(maxl, maxr);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); // delete for interactive problems
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
fin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
fin >> a[i];
vector<int> tree = buildTree(n, a);
for (int i = 0; i < m; ++i)
{
int q, a, b;
fin >> q >> a >> b;
if (q == 1)
{
updatePoint(tree, a - 1, b);
}
else
{
fout << queryMax(tree, a - 1, b - 1) << "\n";
}
}
return 0;
}