Pagini recente » Cod sursa (job #1428984) | Cod sursa (job #1174252) | Istoria paginii utilizator/hai_la_olimpiada_2019-2020_sv | Cod sursa (job #1035657) | Cod sursa (job #2289833)
#include <fstream>
using namespace std;
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int a[100005], n, lg[100005], tata[100005], sol[100005];
void f(int id)
{
int st = 1, dr = lg[0];
while(st <= dr)
{
int mid = (st+dr)/2;
if(a[lg[mid]] >= a[id])
dr = mid - 1;
else
st = mid + 1;
}
if(dr == lg[0])
{
lg[0]++;
lg[lg[0]] = id;
}
else
if(a[id] < a[lg[dr+1]])
lg[dr+1] = id;
if(dr == 0)
tata[id] = 0;
else
tata[id] = lg[dr];
}
int main()
{
cin>>n;
for(int i = 1; i <= n; ++i)
cin>>a[i];
for(int i = 1; i <= n; ++i)
f(i);
cout<<lg[0]<<"\n";
int poz = lg[lg[0]];
while(poz > 0)
{
sol[0]++;
sol[sol[0]] = a[poz];
poz = tata[poz];
}
for(int i = sol[0]; i >= 1; --i)
cout<<sol[i]<<" ";
return 0;
}