Pagini recente » Cod sursa (job #2424589) | Cod sursa (job #2434020) | Cod sursa (job #667753) | Cod sursa (job #3236) | Cod sursa (job #2867901)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define NMAX 100005
int n, a[NMAX];
void Scmax(int N, int v[])
{
int D[NMAX], p[NMAX];
memset(D, 0, sizeof(D));
int k = 1;
D[k] = v[1];
p[1] = 1;
for (int i=2;i<=n;i++){
if (v[i] > D[k]){
D[++k] = v[i];
p[i] = k;
}else{
int st = 1, dr = k, nr = k + 1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if (D[mij] > v[i]){
nr = mij;
dr = mij - 1;
}else{
st = mij + 1;
}
}
D[nr] = v[i];
p[i] = nr;
}
}
int sir[NMAX];
int j=n;
for (int i=k;i>=1;--i){
while(p[j] != i)
j --;
sir[i] = j;
}
fout << k << '\n';
for (int i=1;i<=k;i++){
fout << v[sir[i]] << ' ';
}
}
int main() {
fin >> n;
for (int i=1;i<=n;i++){
fin >> a[i];
}
Scmax(n, a);
return 0;
}