You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.9 KiB
C++
69 lines
1.9 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
int tr[200005];
|
|
int a[200005];
|
|
void build(int root, int a[], int l, int r)
|
|
{
|
|
if (l == r)
|
|
tr[root] = a[l];
|
|
else
|
|
{
|
|
int mid = (l + r) / 2;
|
|
build(root * 2 + 1, a, l, mid);
|
|
build(root * 2 + 2, a, mid + 1, r);
|
|
tr[root] = max(tr[root * 2 + 1], tr[root * 2 + 2]);
|
|
}
|
|
return;
|
|
}
|
|
int q(int root, int ql, int qr, int l, int r)
|
|
{
|
|
//cout << "#" << ql + 1 << " " << qr + 1 << endl;
|
|
if (ql < r || qr > l) return printf("# query %d %d ret %d\n", l + 1, r + 1, -1), -1;
|
|
if (ql <= l && r <= qr) return printf("# query %d %d ret %d\n", l + 1, r + 1, tr[root]), tr[root];
|
|
int mid = (l + r) / 2;
|
|
int ans = 0;
|
|
max(q(root * 2 + 1, ql, qr, l, mid), q(root * 2 + 2, ql, qr, mid + 1, r));
|
|
printf("# query %d %d ret %d\n", l + 1, r + 1, ans);
|
|
return ans;
|
|
}
|
|
void mof(int root, int l, int r, int now, int nw)
|
|
{
|
|
if (l == r)
|
|
{
|
|
if (now == l) tr[root] = nw;
|
|
//printf("# modify %d %d to %d \n", l+1, r+1, tr[root]);
|
|
return;
|
|
}
|
|
int mid = (l + r) / 2;
|
|
if (now <= mid)
|
|
mof(root * 2 + 1, l, mid, now, nw);
|
|
else
|
|
mof(root * 2 + 2, mid + 1, r, now, nw);
|
|
tr[root] = max(tr[root * 2 + 1], tr[root * 2 + 2]);
|
|
//printf("# modify %d %d to %d \n", l+1, r+1, tr[root]);
|
|
return;
|
|
}
|
|
int main()
|
|
{
|
|
int n, m;
|
|
while (cin >> n >> m)
|
|
{
|
|
for (int i = 0; i < n; i++) cin >> a[i];
|
|
build(0, a, 0, n - 1);
|
|
char h;
|
|
int a, b;
|
|
for (int i = 0; i < m; i++)
|
|
{
|
|
cin >> h;
|
|
cin >> a >> b;
|
|
if (h == 'Q')
|
|
cout << q(0, a - 1, b - 1, 0, n - 1) << endl;
|
|
else
|
|
mof(0, 0, n - 1, a - 1, b);
|
|
}
|
|
}
|
|
system("pause");
|
|
return 0;
|
|
} |