Pagini recente » Cod sursa (job #2731755) | Cod sursa (job #2721485) | Cod sursa (job #1543505) | Cod sursa (job #2487901) | Cod sursa (job #2827927)
#include <fstream>
using namespace std;
const int N = 1e5;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, v[N], lung[N], nv, valmin[N+1];
void sirul(int poz)
{
///caut in stanga lui poz un p cu v[p]<v[poz] si lung[p]=lung[poz]-1
int p = poz - 1;
while (p >= 0 && (v[p] >= v[poz] || lung[p] != lung[poz] - 1))
{
p--;
}
if (p >= 0)
{
sirul(p);
}
out << v[poz] << " ";
}
int caut_bin(int x)
{
int st = 1, dr = nv, rez = 0;
while (st <= dr)
{
int m = (st + dr) / 2;
if (valmin[m] < x)///m are propr.: exista un subsir str. cresc. de lungime m la care pot sa-l adaug pe x
{
rez = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return rez;
}
int main()
{
in >> n;
int pmax = 0;
for (int i = 0; i < n; i++)
{
in >> v[i];
int j0 = caut_bin(v[i]);
lung[i] = 1 + j0;///il adaug pe v[i] la cel mai lung subsir str. cresc. la care il pot lipi
if (j0 == nv)
{
nv++;
}
valmin[1+j0] = v[i];
if (lung[i] > lung[pmax])
{
pmax = i;
}
}
out << lung[pmax] << "\n";
sirul(pmax);
in.close();
out.close();
return 0;
}