Pagini recente » Cod sursa (job #2166016) | Cod sursa (job #1643854) | Cod sursa (job #2057596) | Cod sursa (job #79709) | Cod sursa (job #976203)
Cod sursa(job #976203)
#include <fstream>
#include <algorithm>
#include <vector>
#define In "scmax.in"
#define Out "scmax.out"
#define Nmax 100002
#define Lim 9000000
#define Next (++pos==Lim)?(in.read(Buffer,Lim),pos = 0):0
using namespace std;
int N, dp[Nmax], Last[Nmax], a[Nmax], v[Nmax], A[Nmax], sol, pos;
char Buffer[Lim];
class Aib
{
public:
inline void Update(const int poz,const int val)
{
for(int i = poz;i <= N;i += (i)&(-(i)))
if(dp[aib[i]]<dp[val])
aib[i] = val;
}
inline int Query(const int x)
{
int i, ret = 0;
for(i = x; i; i-= (i)&(-(i)))
if(dp[aib[i]] > dp[ret])
ret = aib[i];
return ret;
}
private :int aib[Nmax];
};
Aib AIB;
ifstream in(In);
ofstream out(Out);
inline void Read(int &x)
{
while(Buffer[pos]<'0' || '9'<Buffer[pos])
Next;
x = 0;
while('0'<=Buffer[pos] && Buffer[pos]<='9')
{
x = x*10 +Buffer[pos]-'0';
Next;
}
}
inline void Read()
{
in.read(Buffer,Lim);
Read(N);
for(int i = 1;i <= N;++i)
{
Read(A[i]);
a[i] = A[i];
}
in.close();
}
inline void Normalization()
{
int i;
sort(A+1,A+N+1);
for(i = 1;i <= N; ++i)
v[i] = upper_bound(A+1,A+N+1,a[i])-A-1;
}
inline void Solve()
{
int i, j;
for(i=1;i<=N;++i)
{
j = AIB.Query(v[i]-1);
dp[i] = 1+dp[j];
Last[i] = j;
AIB.Update(v[i],i);
if(dp[i]>dp[sol])
sol = i;
}
}
inline void Write()
{
int i,n = dp[sol],v[Nmax];
out<<n<<"\n";
for(i = 1; sol ;sol = Last[sol],++i)
v[i] = a[sol];
for(i = n;i;--i)
out<<v[i]<<" ";
out<<"\n";
out.close();
}
int main()
{
Read();
Normalization();
Solve();
Write();
return 0;
}