Mai intai trebuie sa te autentifici.
Cod sursa(job #2566691)
Utilizator | Data | 2 martie 2020 23:27:19 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 50 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.75 kb |
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int a[400100], b[100010], o, n;
void in(int s, int d, int x)
{
int mi = (s + d) / 2;
if (s == d)
{
a[x] = b[s];
}
else
{
x = x * 2;
in(s, mi, x);
in(mi + 1, d, x + 1);
if (a[x] > a[x + 1])
a[x / 2] = a[x];
else
a[x / 2] = a[x + 1];
}
}
void inserare(int s, int d, int x, int t, int u)
{
int mi;
mi = (s + d) / 2;
if (s == d and s == t)
{
a[x] = u;
}
else
{
x = x * 2;
if (mi >= t)
inserare(s, mi, x, t, u);
else
inserare(mi + 1, d, x + 1, t, u);
if (a[x] > a[x + 1])
a[x / 2] = a[x];
else
a[x / 2] = a[x + 1];
}
}
int interval(int s, int d, int x, int y, int u)
{
int mi, k, v;
mi = (s + d) / 2;
k = v = 0;
//if (d >= s)
{
if (x <= s and y >= d)
return a[u];
else
{
u = u * 2;
if (mi >= x)
v = interval(s, mi, x, y, u);
if (mi + 1 <= y)
k = interval(mi + 1, d, x, y, u + 1);
if (k > v)
return k;
else
return v;
}
}
}
int main()
{
int x, y, k, i, m;
f >> n >> m;
for (i = 1; i <= n; i++)
f >> b[i];
o = 0;
in(1, n, 1);
for (i = 1; i <= m; i++)
{
f >> k >> x >> y;
if (k == 0)
g << interval(1, n, x, y, 1) << endl;
else {
inserare(1, n, 1, x, y);
}
}
}