Pagini recente » Cod sursa (job #2849836) | Cod sursa (job #1669967) | Cod sursa (job #2883891) | Cod sursa (job #1257892) | Cod sursa (job #3247091)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5 + 5;
int v[NMAX], d[NMAX], p[NMAX], result[NMAX];
int n;
void read_data()
{
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
}
int BinarySearchFirstHigher(int val, int st, int dr)
{
int mid, rez=0;
while(st<=dr)
{
mid=(st+dr)/2;
if(val<=d[mid])
{
rez=mid;
dr=mid-1;
}
else
{
st=mid+1;
}
}
return rez;
}
int main()
{
read_data();
int k = 1;
d[k] = v[1];
p[1] = 1;
for(int i = 2; i <= n; i++)
{
if(v[i] > d[k])
{
k++;
d[k] = v[i];
p[i] = k;
}
else
{
int pos=BinarySearchFirstHigher(v[i], 1, k);
d[pos] = v[i];
p[i] = pos;
}
}
int j = n;
for(int i = k; i >= 1; i--)
{
while(p[j] != i)
j--;
result[i] = j;
}
out << k << "\n";
for(int i = 1; i <= k; i++)
{
out << v[result[i]] << " ";
}
return 0;
}