Pagini recente » Cod sursa (job #1565043) | Cod sursa (job #1772646) | Cod sursa (job #1951131) | Cod sursa (job #1823764) | Cod sursa (job #1251844)
#include <fstream>
#define Nmax 100100
using namespace std;
int N, Solution, A[Nmax], Min[Nmax], Location[Nmax], DP[Nmax];
int binarySearch(int Value) {
int i, Step;
for(Step = 1; Step <= Solution; Step <<= 1);
for(i = 0; Step; Step >>= 1)
if(i + Step <= Solution && Min[i + Step] < Value)
i += Step;
return Location[i];
}
void Solve() {
int i, position;
Min[++Solution] = A[1];
Location[1] = 1;
DP[1] = 1;
for(i = 2; i <= N; i++) {
position = binarySearch(A[i]);
DP[i] = DP[position] + 1;
if(DP[i] > Solution || Min[DP[i]] > A[i])
Min[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 << Min[i] << ' ';
out << '\n';
out.close();
}
int main() {
Read();
Solve();
Write();
return 0;
}