Pagini recente » Cod sursa (job #1114120) | Cod sursa (job #2481116) | Cod sursa (job #239203) | Cod sursa (job #1174266) | Cod sursa (job #2199908)
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, i, m, maxi, a, b, c, v[100001];
struct arb {
arb *stg, *dr;
int val;
};
arb A;
int max(int a, int b) {
return ((a > b) ? a : b);
}
void construct(int s, int d, arb *ai) {
int mij = (s + d) / 2;
if (s != d) {
ai->stg = new arb;
construct(s, mij, ai->stg);
ai->dr = new arb;
construct(mij + 1, d, ai->dr);
ai->val = max(ai->dr->val, ai->stg->val);
} else {
ai->val = v[s];
}
}
void update(int s, int d, arb *ai) {
if (s == d) {
ai->val = b;
} else {
int mij = (s + d) / 2;
if (mij >= a)
update(s, mij, ai->stg);
else
update(mij + 1, d, ai->dr);
ai->val = max(ai->stg->val, ai->dr->val);
}
}
void query(int s, int d, arb *ai) {
if (s >= a && d <= b) {
maxi = max(maxi, ai->val);
return;
}
int mij = (s + d) / 2;
if (a <= mij)
query(s, mij, ai->stg);
if (b > mij)
query(mij + 1, d, ai->dr);
}
int main() {
f >> n >> m;
for (i = 1; i <= n; ++i)
f >> v[i];
construct(1, n, &A);
for (i = 1; i <= m; ++i) {
f >> c >> a >> b;
if (c == 0) {
maxi = -1;
query(1, n, &A);
g << maxi << '\n';
} else {
update(1, n, &A);
}
}
return 0;
}