Pagini recente » Cod sursa (job #298489) | Cod sursa (job #513752) | Cod sursa (job #898560) | Cod sursa (job #3181752) | Cod sursa (job #1364283)
#include <cstdio>
#include <algorithm>
#include <vector>
#define DIM 3666013
using namespace std;
char buffer[DIM];
int poz = DIM - 1;
void Scanf(int &A){
A = 0;
while('0' > buffer[poz] || buffer[poz] > '9')
if(++poz == DIM)
fread(buffer,1,DIM,stdin),poz = 0;
while('0' <= buffer[poz] && buffer[poz] <= '9')
{
A = A * 10 + buffer[poz] - 48;
if(++poz == DIM)
fread(buffer,1,DIM,stdin),poz = 0;
}
}
vector<int> D,DP,daddy,pozitie,sol;
int N;
void Read()
{
Scanf(N);
D.resize(N);
daddy.resize(N);
for(int i = 0; i < N; ++i)
Scanf(D[i]);
}
void Dynamic()
{
int crt,best,pzbest,pz;
for(int i = 0; i < N; ++i)
{
crt = D[i];
pz = lower_bound(DP.begin(),DP.end(),crt) - DP.begin();
if(pz == DP.size()){
DP.push_back(D[i]);
pozitie.push_back(i);
if(pz)
daddy[i] = pozitie[pz - 1];
continue;
}
DP[pz] = D[i];
pozitie[pz] = i;
if(pz)
daddy[i] = pozitie[pz-1];
}
}
void Print()
{
int pz = pozitie[DP.size()-1];
printf("%d\n",DP.size());
for(int i = DP.size(); i >= 1; --i){
sol.push_back(D[pz]);
pz = daddy[pz];
}
for(int i = DP.size() - 1; i >= 0; --i)
printf("%d ",sol[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
Read();
Dynamic();
Print();
return 0;
}