Pagini recente » Cod sursa (job #2571547) | Cod sursa (job #1338659) | Cod sursa (job #443136) | Cod sursa (job #2741117) | Cod sursa (job #3196369)
#include <fstream>
using namespace std;
const int N = 1e5;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[N], l_max[N], val_min[N+1];
void refac_subsir(int poz, int val, int lung)
{
if (lung == 1)
{
return;
}
if (v[poz] < val && l_max[poz] == lung - 1)
{
refac_subsir(poz - 1, v[poz], l_max[poz]);
out << v[poz] << " ";
}
else
{
refac_subsir(poz - 1, val, lung);
}
}
int caut_bin(int x[], int st, int dr, int val)
{
///cautam binal in vecorul ordonat strict crescator x cel mai mare j cu x[j] < val
int rez = st - 1;
while (st <= dr)
{
int m = (st + dr) / 2;
if (x[m] < val)
{
rez = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return rez;
}
int main()
{
int n, ultim = 0, n_val_min = 0;
in >> n;
for (int i = 0; i < n; i++)
{
in >> v[i];
int j0 = caut_bin(val_min, 1, n_val_min, v[i]);
if (j0 == n_val_min)
{
n_val_min++;
}
val_min[j0+1] = v[i];
l_max[i] = 1 + j0;
if (l_max[i] > l_max[ultim])
{
ultim = i;
}
}
out << l_max[ultim] << "\n";
refac_subsir(ultim, v[ultim] + 1, l_max[ultim] + 1);
in.close();
out.close();
return 0;
}