Pagini recente » Cod sursa (job #1953301) | Cod sursa (job #2663078) | Cod sursa (job #1099212) | Cod sursa (job #400019) | Cod sursa (job #775360)
Cod sursa(job #775360)
#include <fstream>
#include <algorithm>
#define LE 100600
#define zeros(X) ((X^(X-1))&X)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int poz_max,maxim,aux[LE],v[LE],n,A[LE],i,ind[LE],t,valu[LE],ve[LE],k;
inline bool cmp(int AA,int BB)
{
return v[AA]<v[BB];
}
inline void Push(int poz,int val)
{
for(;poz<=n;poz+=zeros(poz))
A[poz]=max(A[poz],val);
}
inline int query(int poz)
{
int rez=0;
for(;poz;poz-=zeros(poz))
rez=max(rez,A[poz]);
return rez;
}
int main()
{
f>>n;
for(i=1;i<=n;++i) f>>v[i],ind[i]=i;
sort(ind+1,ind+n+1,cmp);
for(i=1;i<=n;++i)
if (v[ind[i]]!=v[ind[i-1]]) valu[ind[i]]=(++t);
else valu[ind[i]]=t;
for(i=1;i<=n;++i)
{
aux[i]=query(valu[i]-1)+1;
Push(valu[i],aux[i]);
poz_max=aux[i]>maxim?i:poz_max;
maxim=aux[i]>maxim?aux[i]:maxim;
}
g<<maxim<<'\n';
/*for(int maxval=v[poz_max]+1;poz_max;poz_max--)
if (aux[poz_max]==maxim&&v[poz_max]<maxval)
{
maxim--;
maxval=v[poz_max];
ve[++k]=v[poz_max];
}
for(i=k;i>=1;--i)
*/ g<<ve[i]<<" ";
f.close();g.close();
return 0;
}