Pagini recente » Cod sursa (job #944091) | Cod sursa (job #264531) | Cod sursa (job #2922248) | Cod sursa (job #1553841) | Cod sursa (job #2772445)
#include <bits/stdc++.h>
using namespace std;
const int mxN = 1e5 + 7;
int n, t[mxN], tata[mxN], v[mxN]; //t[i] = j -> reprezinta indicele(j) a ultimului element dintr - o secventa de lungime i
//r[i] = j -> indicele de unde provine j este i
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void secventa(int poz) {
if (poz == 0) {
return;
}
secventa(tata[poz]);
cout << v[poz] << " ";
}
int main() {
ios::sync_with_stdio(false), fin.tie(nullptr), fout.tie(nullptr);
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
}
int m = 1;
t[1] = 1;
for (int i = 2; i <= n; ++i) {
int st = 1, dr = m;
while (st <= dr) {
int mij = (st + dr) / 2;
if (v[i] > v[t[mij]]) {
st = mij + 1;
} else {
dr = mij - 1;
}
}
if (st > m) {
m++;
}
t[m] = i;
tata[i] = t[m - 1];
}
fout << m << '\n';
secventa(t[m]);
return 0;
}