Pagini recente » Cod sursa (job #1810775) | Cod sursa (job #2390359) | Cod sursa (job #2135297) | Cod sursa (job #326915) | Cod sursa (job #541220)
Cod sursa(job #541220)
#include <stdio.h>
#include <algorithm>
#define N 100005
int n;
int BIT[N];
int SirInitial[N];
int SirDistinct[N];
int SirSort[N];
int len[N];
using namespace std;
int binSrch(int val) {
int st = 1;
int dr = SirDistinct[0];
while (st <= dr) {
int mij = (st + dr) / 2;
if (SirDistinct[mij] < val) st = mij + 1;
else
if (SirDistinct[mij] > val) dr = mij - 1;
else
return mij;
}
return 0;
}
int Query(int p) {
int max = BIT[p];
while (p > 0) {
if (max < BIT[p]) max = BIT[p];
p -= (p & -p);
}
return max;
}
int Update(int p, int lval) {
while (p <= SirDistinct[0]) {
if (lval > BIT[p]) BIT[p] = lval;
p += (p & -p);
}
}
int printSol(int p, int u) {
int x = p;
if (u == -1) return 0;
while (len[p] != u) p--;
while (len[p] == u && SirDistinct[SirInitial[p]] >= SirDistinct[SirInitial[x]])
p--;
printSol(p, u-1);
printf("%d ",SirDistinct[SirInitial[x]]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i = 1; i <= n; i++) {
scanf("%d",&SirInitial[i]);
SirSort[i] = SirInitial[i];
}
sort(SirSort + 1, SirSort + n + 1);
for(int i = 0; i < n; i++)
if (SirSort[i] != SirSort[i+1]) {
SirDistinct[++SirDistinct[0]] = SirSort[i + 1];
}
for(int i = 1; i <= n; i++)
SirInitial[i] = binSrch(SirInitial[i]);
for(int i = 1; i <= n; i++) {
int best = 0;
best = Query(SirInitial[i] - 1);
len[i] = best + 1;
Update(SirInitial[i],best + 1);
}
int max = 0;
int poz = 0;
for(int i = 1; i <= n; i++) {
if (max < len[i]) {
max = len[i];
poz = i;
}
}
printf("%d\n",max);
printSol(poz, max - 1);
printf("\n");
return 0;
}