Pagini recente » Cod sursa (job #1534546) | Borderou de evaluare (job #1534287) | Cod sursa (job #1534477) | Cod sursa (job #456813) | Cod sursa (job #3320848)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, dp[100001], a[100001], b[100001], pos[100001];
/**
dp[i] = Cea mai mica valoare cu care se termina un subsir cresc.
de lungime i
pos[i] = Pozitia la care am pus a[i] in vectorul dp
24 12 15 15 19 14 11
dp[1] = 11 pos[1] = 1
dp[2] = 14 pos[2] = 1
dp[3] = 19 pos[3] = 2
pos[4] = 2
pos[5] = 3
pos[6] = 2
pos[7] = 1
*/
int CautBin(int x, int n)
{
int st = 1, dr = n, mij, poz;
while (st <= dr)
{
mij = (st + dr) / 2;
if (dp[mij] >= x)
{
poz = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
return poz;
}
int main()
{
int i, k = 1, p, ok, val, k2;
fin >> n;
for (i = 1 ; i <= n ; i++)
fin >> a[i];
dp[1] = a[1];
pos[1] = 1;
for (i = 2 ; i <= n ; i++)
{
if (a[i] <= dp[k])
{
p = CautBin(a[i], k);
dp[p] = a[i];
pos[i] = p;
}
else
{
dp[++k] = a[i];
pos[i] = k;
}
}
k2 = k;
fout << k << "\n";
ok = 1;
for (i = 1 ; i <= n && ok == 1 ; i++)
if (pos[i] == k)
{
p = i;
ok = 0;
}
val = a[p]; b[k] = a[p];
for (i = p - 1 ; i >= 1 ; i--)
if(a[i] < val && pos[i] == k - 1)
{
val = a[i];
b[--k] = a[i];
}
for (i = 1 ; i <= k2 ; i++)
fout << b[i] << " ";
return 0;
}