Pagini recente » Solutia problemei shoturi | Cod sursa (job #1861244) | Cod sursa (job #638629) | Cod sursa (job #2142068) | Cod sursa (job #1936648)
#include <fstream>
#include <climits>
#define INF INT_MAX
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void ins(int x);
int n, lg, cautat, v[100005], poz[100005], sir[100005], sol[100005];
//sir[i] = cel mai mic numar care poate sta pe pozitia i in subsirul crescator
int main()
{
int i;
fin >> n;
sir[1] = INF;
for (i = 1; i <= n; i++)
{
fin >> v[i];
ins(i);
}
fout << lg << '\n';
cautat = lg;
i = n;
while (cautat)
{
if (poz[i] == cautat)
{
sol[cautat] = i;
cautat--;
}
i--;
}
for (i = 1; i <= lg; i++)
fout << v[sol[i]] << ' ';
fout << '\n';
return 0;
}
void ins(int i)
{
int st, dr, mij, x=v[i];
st = 1;
dr = lg + 1;
while (st < dr)
{
mij = (st + dr) / 2;
if (x <= sir[mij])
dr = mij;
else st = mij + 1;
}
if (st > lg)
{
lg++;
sir[lg + 1] = INF;
}
sir[st] = x;
poz[i] = st;
}