Pagini recente » Cod sursa (job #966235) | Cod sursa (job #2198066) | Cod sursa (job #1653122) | Cod sursa (job #2694512) | Cod sursa (job #525839)
Cod sursa(job #525839)
#include<fstream>
#define nmax 100001
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int lg[nmax],a[nmax],sr[nmax],n,nrc;
void solve();
void read();
int bsrc(int A[],int in,int sf,int val);
void write();
int main()
{
read();
solve();
write();
f.close();
g.close();
return 0;
}
void read()
{
int i;
f>>n;
for (i=1;i<=n;++i)
f>>a[i];
}
void solve()
{
int i,p;
nrc=1;
sr[nrc]=0;
lg[1]=n;
for (i=n-1;i;--i)
{
p=bsrc(lg,1,nrc,a[i]);
if (nrc==p)
{
++nrc;
lg[nrc]=i;
}
else
if (a[i]>a[lg[p+1]])
lg[p+1]=i;
sr[i]=lg[p];
}
}
void write()
{
int i;
i=lg[nrc];
g<<nrc<<'\n';
while (i)
{
g<<a[i]<<' ';
i=sr[i];
}
}
int bsrc(int A[],int in,int sf,int val)
{
int mij=in+((sf-in)>>1);
if (sf>in)
if (val>=a[lg[mij]]) return bsrc(A,in,mij-1,val);
else return bsrc(A,mij+1,sf,val);
if (a[lg[mij]]<=val)
return mij-1;
return in;
}