Pagini recente » Arhiva de probleme | Cod sursa (job #701435) | Cod sursa (job #1896075) | Cod sursa (job #4497) | Cod sursa (job #1198650)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
class BIT2
{
int n;
vector<int> t1, t2;
public:
BIT2(const vector<int> & a)
{
n = a.size();
t1.resize(n+1);
t2.resize(n+1);
copy(a.begin(), a.end(), t1.begin()+1);
for (int stp = 2; stp <= n; stp *= 2) {
for (int i = stp; i <= n; i += stp) {
t2[i-stp/2] = t1[i];
t1[i] = max(t1[i-stp/2], t1[i]);
}
}
}
int getmax(int lo, int hi)
{
int res = 0;
if (lo != 0) {
while (lo + (lo & -lo) <= hi) {
res = max(res, t2[lo]);
lo += lo & -lo;
}
}
while (hi > lo) {
res = max(res, t1[hi]);
hi &= hi-1;
}
return res;
}
void update(int idx, int val)
{
int lo = idx;
int hi = idx+1;
while (hi <= n) {
if ((lo & -lo) > (hi & -hi) || lo == 0) {
if (t1[hi] == val) {
break;
}
t1[hi] = val;
val = max(t1[hi], t2[hi]);
hi += hi & -hi;
}
else {
if (t2[lo] == val) {
break;
}
t2[lo] = val;
val = max(t1[lo], t2[lo]);
lo &= lo-1;
}
}
}
};
int main() {
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];
}
BIT2 bit(a);
for (int i = 0; i < m; ++i) {
int op;
fin >> op;
if (op == 0) {
int lo, hi;
fin >> lo >> hi;
fout << bit.getmax(lo-1, hi) << '\n';
}
else {
int idx, val;
fin >> idx >> val;
bit.update(idx-1, val);
}
}
return 0;
}