Pagini recente » Cod sursa (job #371776) | Cod sursa (job #1341336) | Cod sursa (job #423818) | Cod sursa (job #2027543) | Cod sursa (job #2212917)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int NMAX = 100002;
int v[NMAX], aib[NMAX], d[NMAX], cp[NMAX], sol[NMAX], last[NMAX], n, k;
int cautare_binara (int x) {
int st = 1, dr = k, rez;
while (st <= dr) {
int mij = (st + dr) / 2;
if (d[mij] <= x) {
st = mij + 1;
rez = mij;
}
else
dr = mij - 1;
}
return rez;
}
int query (int x) {
int ind = 0;
for (; x; x -= (x & -x))
if (sol[ind] < sol[aib[x]])
ind = aib[x];
return ind;
}
void update (int x, int i) {
for (; x <= n; x += (x & -x))
if (sol[i] > sol[aib[x]])
aib[x] = i;
}
void afisare (int poz) {
if (poz > 0) {
afisare(last[poz]);
fout << cp[poz] << " ";
}
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> v[i];
d[i] = cp[i] = v[i];
}
sort (d + 1, d + n + 1);
for (int i = 1; i <= n; i++)
if (d[i] != d[k])
d[++k] = d[i];
for (int i = 1; i <= n; i++)
v[i] = cautare_binara(v[i]);
for (int i = 1; i <= n; i++) {
last[i] = query(v[i] - 1);
sol[i] = sol[last[i]] + 1;
update(v[i], i);
}
int poz = 0;
for (int i = 1; i <= n; i++) {
if (sol[poz] < sol[i])
poz = i;
}
fout << sol[poz] << "\n";
afisare(poz);
return 0;
}