Pagini recente » Cod sursa (job #1262466) | Cod sursa (job #2150629) | Cod sursa (job #2548227) | Cod sursa (job #2864421) | Cod sursa (job #2763931)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int s[100005], v[100005], lg[100005];
int ant[100005], rez[100005];
int n, maxim;
int main() {
fin >> n;
for(int i = 1; i <= n; i++) {
fin >> v[i];
}
fin.close();
for(int i = 1; i <= n; i++) {
int st = 1, dr = maxim, val = 0;
while(st <= dr) {
int m = (st + dr) / 2;
if(v[s[m]] < v[i]) {
val = m;
st = m + 1;
} else if(v[s[m]] >= v[i]) {
dr = m - 1;
}
}
lg[i] = val + 1;
s[lg[i]] = i;
if(lg[i] > maxim) {
maxim = lg[i];
}
if(lg[i] == 1) {
ant[i] = -1;
} else if(lg[i] > 1) {
ant[i] = s[lg[i] - 1];
}
}
fout << maxim << "\n";
int poz = s[maxim], poz1 = 1;
while(poz != -1) {
rez[poz1] = v[poz];
poz1++;
poz = ant[poz];
}
for(int i = poz1 - 1; i >= 1; i--) {
fout << rez[i] << " ";
}
fout.close();
return 0;
}