Nu aveti permisiuni pentru a descarca fisierul grader_test11.ok
Cod sursa(job #2654510)
Utilizator | Data | 1 octombrie 2020 12:49:12 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 0.92 kb |
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, start, type, x, y;
int a[400005];
void Update(int poz) {
a[poz] = max(a[poz + poz], a[poz + poz + 1]);
if (poz == 1)
return;
Update(poz / 2);
}
int Query(int st, int dr) {
int ans = 0;
if (st % 2 == 1)
ans = a[st++];
if (dr % 2 == 0) {
ans = max(ans, a[dr]);
--dr;
}
if (st > dr)
return ans;
if (st == dr)
return max(a[st], ans);
int aux = Query(st / 2, dr / 2);
return max(ans, aux);
}
int main() {
fin >> n >> m;
start = 1;
for (int i = 1; start < n; ++i)
start <<= 1;
for (int i = 0; i < n; ++i) {
fin >> a[start + i];
Update((start + i) / 2);
}
for (int i = 1; i <= m; ++i) {
fin >> type >> x >> y;
if (type == 1) {
a[x + start - 1] = y;
Update((x + start - 1) / 2);
} else {
fout << Query(x + start - 1, y + start - 1) << '\n';
}
}
}