Pagini recente » Cod sursa (job #2684197) | Cod sursa (job #2681626) | Cod sursa (job #1999090) | Cod sursa (job #2685917) | Cod sursa (job #2171590)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100001;
int v[NMAX], b[NMAX], pred[NMAX], sol[NMAX];
int caut(int x, int dr)
{
int st = 1, ans;
while(st <= dr) {
int m = (st + dr) >> 1;
if(v[b[m]] >= x) {
dr = m - 1;
ans = m;
} else {
st = m + 1;
}
}
return ans;
}
int main()
{
int n, x, l = 0;
fin >> n;
n++;
for(int i = 1; i < n; i++) {
fin >> v[i];
if(v[i] > v[b[l]]) {
b[++l] = i;
pred[i] = b[l - 1];
} else {
int poz = caut(v[i], l);
b[poz] = i;
pred[i] = b[poz - 1];
}
}
fout << l << '\n';
int poz = b[l], k = 0;
sol[0] = v[poz];
while(pred[poz]) {
poz = pred[poz];
sol[++k] = v[poz];
}
for(int i = k; i >= 0; i--)
fout << sol[i] << " ";
return 0;
}