Pagini recente » Cod sursa (job #1052101) | Cod sursa (job #3151354) | Cod sursa (job #585813) | Cod sursa (job #1868067) | Cod sursa (job #2514582)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int val[NMAX], temp[NMAX], ls[NMAX], ans[NMAX], maxV, N, k;
int bs(int value, int lg)
{
int pas = 1 << 20, r = 0;
while(pas){
if(r + pas <= lg && temp[r + pas] < value){
r += pas;
}
pas /= 2;
}
return r;
}
void Inlocuire(int lg){
for(int i = 1; i <= lg; i++){
ans[i] = temp[i];
}
}
bool CMP(int lg)
{
for(int i = 1; i <= lg; i++){
if(ans[i] > temp[i])
return true;
}
return false;
}
bool isPrime(int value){
if(value <= 1)
return true;
int i;
for(i = 2; i * i < value; i++){
if(value % i == 0)
return false;
}
if(i * i == value)
return false;
return true;
}
void Subsir(){
int lg = 1;
maxV = 1;
temp[1] = val[1];
ans[1] = val[1];
ls[1] = 1;
for(int i = 2; i <= k; i++){
int answ = bs(val[i],lg);
if(answ == lg){
temp[++lg] = val[i];
maxV = lg;
//Inlocuire(lg);
}
else {
temp[answ + 1] = val[i];
}
ls[i] = answ + 1;
/*if(answ + 1 == maxV && CMP(lg)){
Inlocuire(lg);
}*/
}
}
int main()
{
int v;
fin >> N;
for(int i = 1; i <= N; i++){
fin >> v;
//if(isPrime(v)){
val[++k] = v;
//cout << v << " ";
//}
}
Subsir();
fout << maxV << "\n";
for(int i = 1; i <= maxV; i++){
fout << temp[i] << " ";
}
return 0;
}