Pagini recente » Cod sursa (job #2094861) | Cod sursa (job #30092) | Cod sursa (job #2340017) | Cod sursa (job #2908385) | Cod sursa (job #2778364)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005];
int cautare(int v[], int st, int dr, int x)
{
int mij;
while(dr - st > 1){
mij = st + (dr - st) / 2;
if (v[mij] >= x){
dr = mij;
}else{
st = mij;
}
}
return dr;
}
void Scmax(int N, int v[])
{
int tail[N], p[N];
memset(tail, 0, sizeof(tail));
int len = 1;
tail[0] = v[0];
p[0] = 1;
for (int i=1;i<N;i++){
if (v[i] < tail[0]){
tail[0] = v[i];
p[i] = 0;
}else if (v[i] > tail[len - 1]){
p[i] = len;
tail[len ++] = v[i];
}else{
int pos = cautare(tail, -1, len - 1, v[i]);
tail[pos] = v[i];
p[i] = pos;
}
}
fout << len << '\n';
int ans[N], j = N - 1;
for (int i=len-1;i>=0;i--){
while(p[j] != i)
j --;
ans[i] = v[j];
}
for (int i=0;i<len;i++){
fout << ans[i] << ' ';
}
fout << '\n';
}
int main() {
fin >> n;
for (int i=0;i<n;i++){
fin >> a[i];
}
Scmax(n, a);
return 0;
}