Pagini recente » Cod sursa (job #3267525) | Cod sursa (job #2529241) | Cod sursa (job #1009835) | Cod sursa (job #195290) | Cod sursa (job #2245669)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
const int MAX = 1e5 + 14;
int v [MAX];
int dp [MAX];
int pos [MAX];
int lst [MAX];
int main() {
int n;
cin >> n ;
for (int i = 1; i <= n; ++ i)
cin >> v [i];
int bestDp = 0;
for (int i = 1; i <= n; ++ i)
{
int st = 1;
int dr = bestDp;
int sol = 0;
while (st <= dr)
{
int mij = (st + dr) >> 1;
if (dp [mij] <= v [i])
{
sol = mij;
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
dp [sol + 1] = v [i];
pos [sol + 1] = i;
lst [i] = pos [sol];
bestDp = max (bestDp, sol + 1);
}
cout << bestDp << '\n';
vector <int> sol;
int cur = pos [bestDp];
while (cur)
{
sol.push_back(cur);
cur = lst [cur];
}
while (sol.size()) {
cout << v[sol.back()] << ' ';
sol.pop_back();
}
return 0;
}