Mai intai trebuie sa te autentifici.
Cod sursa(job #2357154)
Utilizator | Data | 27 februarie 2019 10:16:17 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.19 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
class Aint {
private:
vector <int> data;
int sz;
public:
void setSize(int dim) {
sz = dim;
}
void init() {
data.resize(4 * sz + 10);
}
void update(int st, int dr, int pos, int id, int val) {
if (st == dr) {
data[pos] = val;
return;
}
int mid = (st + dr) / 2;
if (id <= mid)
update(st, mid, pos << 1, id, val);
else update(mid + 1, dr, pos << 1 | 1, id, val);
data[pos] = max(data[pos << 1], data[pos << 1 | 1]);
}
int query(int st, int dr, int pos, int l, int r) {
if (l <= st && dr <= r)
return data[pos];
int mid = (st + dr) / 2;
int left = 0, right = 0;
if (l <= mid)
left = query(st, mid, pos << 1, l, r);
if (r > mid)
right = query(mid + 1, dr, pos << 1 | 1, l, r);
return max(left, right);
}
};
int main() {
int n, m, x, y, c;
Aint v;
in >> n >> m;
v.setSize(n);
v.init();
for (int i = 1; i <= n; i++) {
in >> x;
v.update(1, n, 1, i, x);
}
while (m--) {
in >> c >> x >> y;
if (c == 0)
out << v.query(1, n, 1, x, y) << '\n';
else v.update(1, n, 1, x, y);
}
return 0;
}