Mai intai trebuie sa te autentifici.
Cod sursa(job #626328)
Utilizator | Data | 26 octombrie 2011 20:53:12 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.17 kb |
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, aint[300300], cit, m;
void update(int st, int dr, int nod, int val, int poz)
{
if (st >= dr)
{
aint[nod] = val;
return ;
}
int m = (st + dr) / 2;
if (poz <= m)
update(st, m, nod * 2, val, poz);
else
update(m + 1, dr, nod * 2 + 1, val, poz);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
int query(int st, int dr, int i, int j, int nod)
{
if (i <= st && dr <= j) return aint[nod];
int m = (st + dr) / 2, sol = 0;
if (i <= m) sol = max(sol, query(st, m, i, j, nod * 2));
else
if (m < j) sol = max(sol, query(m + 1, dr, i, j, nod * 2 + 1));
return sol;
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; ++i)
{
f >> cit;
update(1, n, 1, cit, i);
}
for (int i = 1; i <= m; ++i)
{
int Q, x, y;
f >> Q >> x >> y;
if (!Q)
{
g << query(1, n, x, y, 1) << '\n';
}
else
update(1, n, 1, y, x);
}
return 0;
}