Cod sursa(job #2387929)
Utilizator | Data | 25 martie 2019 14:32:32 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.6 kb |
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int N=100000+7;
int n;
int v[N];
int id[N],y;
int t[N];
int res[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
for(int i=1;i<=n;i++)
{
if(i==1 || v[id[y]]<v[i])
{
y++;
id[y]=i;
t[i]=id[y-1];
}
else
{
int lo=1;
int hi=y;
int res=1;
while(lo<=hi)
{
int mid=(lo+hi)>>1;
if(v[id[mid]]<v[i])
{
lo=mid+1;
}
else
{
res=mid;
hi=mid-1;
}
}
t[i]=id[res-1];
id[res]=i;
}
}
cout<<y<<"\n";
int cur=id[y];
for(int i=y;i>=1;i--,cur=t[cur])
{
res[i]=cur;
}
for(int i=1;i<=y;i++)
{
cout<<v[res[i]]<<" ";
}
cout<<"\n";
return 0;
}
/**
1
3
4
6
1 3 5 6
4 5 1
**/