Pagini recente » Cod sursa (job #1029738) | Cod sursa (job #2924372) | Cod sursa (job #1459413) | Cod sursa (job #2852307) | Cod sursa (job #1944778)
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 100005;
const int oo = 2000000005;
int v[NMAX];
int DP[NMAX];
int previ[NMAX];
int stiva[NMAX];
int N;
int indice;
void Read(){
in >> N;
for(int i = 1; i <= N; ++i)
in >> v[i];
}
int BinarySearch(int no){
int left = 1, right = indice;
int mid, sol = oo;
while(left <= right){
mid = (left + right) / 2;
if(no <= v[DP[mid]]){
sol = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return sol;
}
void Solve(){
int result;
for(int i = 1; i <= N; ++i){
if(!indice)
DP[++indice] = i;
else{
result = BinarySearch(v[i]);
if(result == oo){
DP[++indice] = i;
previ[indice] = indice - 1;
}
else
DP[result] = i;
}
}
}
void Print(){
int stivind = 0;
out << indice << "\n";
while(indice){
stiva[++stivind] = indice;
indice = previ[indice];
}
while(stivind){
out << v[DP[stiva[stivind]]] << " ";
--stivind;
}
}
int main(){
Read();
Solve();
Print();
return 0;
}