Pagini recente » Cod sursa (job #75584) | Cod sursa (job #2371527) | Cod sursa (job #762763) | Cod sursa (job #3190120) | Cod sursa (job #1251847)
#include <fstream>
#define Nmax 100100
using namespace std;
int N, Solution, A[Nmax], Min[Nmax], Location[Nmax], Father[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;
Father[i] = position;
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, int index) {
if(Father[index] != 0)
Write(out, Father[index]);
out << A[index] << ' ';
}
void Write() {
ofstream out("scmax.out");
out << Solution << '\n';
Write(out, Location[Solution]);
out << '\n';
out.close();
}
int main() {
Read();
Solve();
Write();
return 0;
}