Pagini recente » Cod sursa (job #1432242) | Cod sursa (job #2054975) | Cod sursa (job #2535448) | Cod sursa (job #1406716) | Cod sursa (job #1211343)
// S[i] - cea mai mica valoare care poate sa fie finalul unui
// subsir crescator de i elemente
#include <iostream>
#include <fstream>
using namespace std;
#define inf 1<<30
#define nmax 100001
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,i;
int hi = 0,poz;
int A[nmax],S[nmax];
int caut_bin(int lo, int hi, int val) {
while (lo<hi) {
int mid = (hi + lo) / 2;
if (S[mid] < val && S[mid + 1] >= val)
return mid;
if (S[mid] < val)
lo = mid + 1;
else
hi = mid - 1;
}
return hi;
}
int main() {
fin >> n;
for (i=1; i<=n; i++)
fin >> A[i],
S[i] = inf;
S[0] = -inf;
for (i=1; i<=n; i++) {
poz = caut_bin(0, hi, A[i]);
S[poz+1] = A[i];
hi = max(hi, poz+1);
}
fout << hi << "\n";
for (i=1; i<=hi; i++)
fout << S[i] << " ";
return 0;
}