Pagini recente » Cod sursa (job #2711960) | Cod sursa (job #3229636) | Cod sursa (job #1370562) | Cod sursa (job #2892005) | Cod sursa (job #2938132)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, v[100001];
int val_min[100001];
int lung[100001];
int caut_bin(int st, int dr, int val){
int rez = st - 1;
while(st <= dr){
int m = (st + dr) / 2;
if(val_min[m] < val){
rez = m;
st = m + 1;
}else
dr = m - 1;
}
return rez;
}
void refac_subsirul(int p, int val, int l){
if(l == 0)
return;
if(v[p] <= val && lung[p] == l){
refac_subsirul(p - 1, v[p] - 1, l - 1);
fout << v[p] << " ";
}else
refac_subsirul(p - 1, val, l);
}
int main()
{
fin >> n;
for(int i = 0; i < n; i++)
fin >> v[i];
val_min[1] = v[0];
int nelem = 1;
lung[0] = 1;
for(int i = 1; i < n; i++){
int j = caut_bin(1, nelem, v[i]);
val_min[j + 1] = v[i];
if(j + 1 > nelem)
nelem = j + 1;
lung[i] = j + 1;
}
int maxim = 0;
int p = 0;
for(int i = 0 ; i < n; i++){
if(maxim < lung[i]){
maxim = lung[i];
p = i;
}
}
fout << lung[p] << "\n";
refac_subsirul(p, v[p], lung[p]);
return 0;
}