Pagini recente » Cod sursa (job #2736765) | Cod sursa (job #277039) | Cod sursa (job #1931439) | Cod sursa (job #2034971) | Cod sursa (job #2236107)
#include <cstdio>
#include <vector>
FILE *fin = freopen("scmax.in","r",stdin); FILE *fout = freopen("scmax.out","w",stdout);
static const int MAX_N = 100000 + 5;
/* =------------- Data ------------*/
int n, size;
int a[MAX_N], prev[MAX_N], index[MAX_N];
/* =------------- Data ------------*/
void Read()
{
scanf("%d",&n);
for(int i = 1; i<= n; ++i)
scanf("%d",&a[i]);
}
void Construct()
{
int pos;
size = 0;
for(int i = 1; i<= n; ++i)
{
if(a[i] > a[index[size]]){
index[++size] = i;
prev[i] = index[size - 1];
}
else
{
int left = 1, right = size, mid;
while(left <= right)
{
mid = (left+right) >>1;
if(a[i] <= a[index[mid]])
pos = mid, right = mid -1;
else
left = mid + 1;
}
index[pos] = i;
prev[i] = index[pos - 1];
}
}
}
void Reconstruct()
{
printf("%d\n",size);
std::vector<int> v;
int x = index[size];
while(x!=0)
{
v.push_back(a[x]);
x = prev[x];
}
for(auto it = v.end() - 1; it != v.begin(); it--)
{
printf("%d ", *it);
}
printf("%d",v[0]);
}
int main()
{
Read();
Construct();
Reconstruct();
return 0;
}