Pagini recente » Cod sursa (job #2470378) | Cod sursa (job #907143) | Cod sursa (job #2801281) | Cod sursa (job #2783638) | Cod sursa (job #1328963)
#include <fstream>
#define Nmax 100100
using namespace std;
int N, Solution, A[Nmax], DP[Nmax], Best[Nmax], Location[Nmax];
int binarySearch(int value) {
int i, step;
for(step = 1; step < Solution; step <<= 1);
for(i = 0; step != 0; step >>= 1)
if(i + step <= Solution && Best[i + step] < value)
i += step;
return Location[i];
}
void Solve() {
int i, position;
DP[1] = 1;
Solution = 1;
Best[1] = A[1];
Location[1] = 1;
for(i = 2; i <= N; i++) {
position = binarySearch(A[i]);
DP[i] = DP[position] + 1;
if(Best[DP[i]] == 0 || Best[DP[i]] > A[i]) {
Best[DP[i]] = A[i];
Location[DP[i]] = i;
}
if(DP[i] > Solution)
++Solution;
}
}
void Read() {
ifstream in("scmax.in");
in >> N;
for(int i = 1; i <= N; i++)
in >> A[i];
in.close();
}
void Write() {
ofstream out("scmax.out");
out << Solution << '\n';
for(int i = 1; i <= Solution; i++)
out << Best[i] << ' ';
out << '\n';
out.close();
}
int main() {
Read();
Solve();
Write();
return 0;
}