Pagini recente » Cod sursa (job #2742639) | Cod sursa (job #189262) | Cod sursa (job #587807) | Cod sursa (job #1214197) | Cod sursa (job #1150223)
#include <fstream>
#include<algorithm>
using namespace std;
#define Nmax 100003
int x[Nmax], y[Nmax], aib[Nmax], L[Nmax], ante[Nmax],n, poz[Nmax];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void update(int p, int v){
int lsb;
while(p<=n){
if(L[p]> L[aib[v]])
aib[v] = p;
lsb = p&(-p);
p+=lsb;
}
}
int query(int p){
int max = 0,lsb;
while(p>0){
if(L[max]<L[aib[p]])
max = aib[p];
lsb = p&(-p);
p-=lsb;
}
return max;
}
void afis(int i){
if(i!=0)
{
afis(ante[i]);
fout<<y[poz[i]]<<" ";
}
}
int main()
{
fin>>n;
for(int i = 1;i <= n;i++){
fin>>x[i];
y[i]=x[i];
}
sort(y+1,y+n+1);
int k=1, best =0;
for(int i = 2 ; i <= n ; i++){
if(y[k] != y[i])
y[++k] = y[i];
}
for(int i = 1 ; i <= n ; i++)
poz[i] = lower_bound(y+1, y+n+1, x[i]) - y;
for(int i = 1 ; i <= n ; i++){
ante[i] = query(poz[i]-1);
L[i] = L[ante[i]] + 1;
if(L[i] > L[best]) best = i;
update( i, poz[i]);
}
fout<<L[best]<<'\n';
afis(best);
return 0;
}