Pagini recente » Cod sursa (job #3290122) | Cod sursa (job #2938972) | Cod sursa (job #624962) | Cod sursa (job #2085934) | Cod sursa (job #901386)
Cod sursa(job #901386)
//HighFlow
//Subsir crescator maximal cu AIB
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <fstream>
#include <string.h>
#include <cmath>
#include <algorithm>
#define fcat(c) while (c!='\n') fscanf(f,"%c",&c)
#define cat(c) while (c!='\n') scanf("%c",&c)
#define For(i,st,dr,k) for (int i=st;i<=dr;i+=k)
#define ll (long long)
using namespace std;
FILE *f,*g;
int T[100100];
struct cp{int x,y; } d[100100];
int v[100100];
int h[100100];
int bk[100100];
int n,cn,i,j,sol;
bool cmp(cp A,cp B)
{
return A.x<B.x;
}
void update(int x,int val)
{
int i;
for (i=x;i<=n;i=i+(i&(-i)))
T[i]=max(T[i],val);
}
int query(int x)
{
int mx=-1,i;
for (i=x;i>0;i=i-(i&(-i)))
mx=max(mx,T[i]);
return mx;
}
void rec(int ind,int x)
{
if (x==0) return;
while (bk[ind]!=x) ind--;
rec(ind,x-1);
fprintf(g,"%d ",v[ind]);
}
int main()
{
f=fopen("scmax.in","r");
g=fopen("scmax.out","w");
fscanf(f,"%d",&n);
for (i=1;i<=n;i++)
{
fscanf(f,"%d",&v[i]);
d[i].x=v[i];
d[i].y=i;
}
stable_sort(d+1,d+n+1,cmp);
for (i=1,cn=0;i<=n;i=j,cn++)
{
for (j=i;d[j].x==d[i].x && j<=n;j++)
{
h[d[j].y]=cn;
}
}
for (i=1;i<=n;i++)
{
if (h[i]==0)
{
bk[i]=1;
update(1,bk[i]);
}
else
{
bk[i]=query(h[i])+1;
update(h[i]+1,bk[i]);
}
}
sol=query(cn);
fprintf(g,"%d\n",sol);
rec(n,sol);
return 0;
}