Pagini recente » Cod sursa (job #1543752) | Cod sursa (job #1484239) | Cod sursa (job #1393790) | Cod sursa (job #2854617) | Cod sursa (job #2331046)
/// O(n*log(n))
/// Robison-Schensted-Knuth - RSK
#include <fstream>
using namespace std;
const int MAXN = 100001;
ifstream in("scmax.in");
ofstream out("scmax.out");
int N, a[MAXN], /// intrare
L[MAXN], /// L[i] = adresa primului element din sirul a pentru care subsirul strict crescator are lungimea i
P[MAXN], /// P[i] = poz elementului care urmeaza dupa a[i] in cel mai lung ssc care incepe cu a[i];
lMax; /// lung max a unui ssc
int cautare(int p, int u, int x) {
while(p <= u) {
int m = (p+u)/2;
if(x < a[L[m]])
p = m+1;
else
u = m-1;
}
return p;
}
void dp() {
for(int i = N; i >= 1; i--) {
/// Prin cautare binare se det cea mai mare lungime k a unui ssc care sa il contina pe a[i]
int k = cautare(1, lMax, a[i]);
P[i] = L[k-1];
if(k > lMax) {
lMax = k;
L[k] = i;
} else
if(a[L[k]] < a[i])
L[k] = i;
}
}
void afis() {
out << lMax << '\n';
for(int i = L[lMax]; i > 0; i = P[i])
out << a[i] << ' ';
}
int main()
{
in >> N;
for(int i = 1; i <= N; i++)
in >> a[i];
dp();
afis();
return 0;
}