Pagini recente » Cod sursa (job #239850) | Cod sursa (job #433857) | Cod sursa (job #607426) | Cod sursa (job #2574400) | Cod sursa (job #1210935)
// S[i] - cea mai mica valoare care poate sa fie finalul unui
// subsir crescator de i elemente
// 24 12 15 15 19
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define INF 1<<30
#define nmax 100001
int n,i,dr,poz;
int a[nmax],s[nmax],inv[nmax];
vector <int> lista[nmax];
int caut_bin(int st, int dr, int val)
{
while(st<dr)
{
int mid=(st+dr)/2;
if(s[mid]<val && s[mid+1]>=val)
return mid;
if(s[mid]<val)
st=mid+1;
else
dr=mid-1;
}
return st;
}
int main() {
fin>>n;
for(i=1;i<=n;i++)
{
fin>>a[i];
}
for(i=1;i<=n;i++)
{
s[i]=INF;
}
s[0]=-INF;
dr=0;
for(i=1;i<=n;i++)
{
poz=caut_bin(0, dr, a[i]);
lista[poz+1].push_back(i);
s[poz+1]=a[i];
dr=max(dr, poz+1);
//cout<<poz<<" ";
}
cout<<dr<<"\n";
int j,k=0;
int ind=lista[dr][lista[dr].size()-1];
for (i=dr; i>=1; i--) {
for(j=lista[i].size()-1;j>=0;j--)
{
if(lista[i][j]<ind)
{
inv[++k] = a[ind];
ind=lista[i][j];
break;
}
}
}
inv[++k] = a[ind];
for (i=k; i>0; i--)
fout << inv[i] << " ";
return 0;
}