Pagini recente » Cod sursa (job #3037823) | Cod sursa (job #1162169) | Cod sursa (job #1161917) | Cod sursa (job #1548516) | Cod sursa (job #345372)
Cod sursa(job #345372)
#include<stdio.h>
#include<algorithm>
using namespace std;
int A[100005];
int S[100005];
int sir[100005];
int i;
int maxim;
int value;
int n;
int from[100005];
char charsir[1110000];
int Arb[263000];
int nr;
int subsir[10000];
int contor;
int best[100005];
int start;
int afis;
int fin;
int inline Maxim(int a, int b)
{
if (a > b) return a;
return b;
}
void Update(int nod, int st, int dr)
{
if (st == dr)
{
Arb[nod] = value;
}
else
{
int mij = (st + dr) / 2;
if (fin + 1 <= mij) Update(2 * nod, st, mij);
else Update(2 * nod + 1, mij + 1, dr);
Arb[nod] = Maxim(Arb[2 * nod],Arb[2 * nod + 1]);
}
}
void Query(int nod, int st, int dr)
{
if (start <= st && dr <= fin)
{
maxim = Maxim(maxim,Arb[nod]);
}
else
{
int mij = (st + dr) / 2;
if (start <= mij ) Query(2 * nod, st, mij );
if (fin > mij) Query(2 * nod + 1, mij + 1, dr);
}
}
int BinSearch(int val)
{
int st = 1;
int dr = sir[0];
while (st <= dr)
{
if (val < sir[(st+dr)/2])
dr = (st + dr) / 2 -1;
else
if (val > sir[(st + dr)/2])
st = (st + dr) / 2 + 1;
else
if (val == sir[(st + dr)/2])
return (st + dr) / 2;
}
}
int Parse()
{
int i = 0;
while (charsir[i] != '\n')
{
if (charsir[i] != ' ') nr = nr * 10 + charsir[i] - '0';
else
{
contor++;
A[contor] = nr;
nr = 0;
}
i++;
}
A[++contor] = nr;
nr = 0;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d\n",&n);
fgets(charsir, n * 11, stdin);
Parse();
memcpy(S,A,sizeof(A));
sort(S + 1, S + n + 1);
i = 1;
while (i <= n)
{
if (S[i] != S[i+1])
sir[++sir[0]] = S[i];
i++;
}
for(int i = 1; i <= n; i++)
{
A[i] = BinSearch(A[i]);
}
for(int i = 1; i <= n; i++)
{
start = 1;
fin = A[i] - 1;
maxim = 0;
if (fin > 0)
{
Query(1,1,sir[0]);
}
best[i] = maxim + 1;
value = best[i];
Update(1,1,sir[0]);
}
for(int i = 1; i <= n; i++)
if (afis < best[i]) afis = best[i];
printf("%d\n",afis);
for(int i = 1; i <= n; i++)
if (afis == best[i])
{
while (afis)
{
subsir[++subsir[0]] = sir[A[i]];
afis--;
while (best[i] != afis) i--;
}
break;
}
for(int i = subsir[0]; i > 0; i--)
printf("%d ",subsir[i]);
return 0;
}