Pagini recente » Cod sursa (job #2545599) | Cod sursa (job #514213) | Cod sursa (job #2313755) | Cod sursa (job #328293) | Cod sursa (job #976196)
Cod sursa(job #976196)
#include <fstream>
#include <algorithm>
#include <vector>
#define In "scmax.in"
#define Out "scmax.out"
#define Nmax 100002
#define Lim 50000
#define f(x) ((x)&(-(x)))
#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 += f(i))
aib[i] = dp[aib[i]] < dp[val]? val: aib[i];
}
inline int Query(const int x)
{
int i, ret = 0;
for(i = x; i; i-= f(i))
ret = dp[aib[i]] < dp[ret]? ret: aib[i];
return ret;
}
private :int aib[Nmax];
};
Aib AIB;
ifstream in(In);
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);
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;
}
}
ofstream out(Out);
inline void Write(const int sol)
{
if(sol)
{
Write(Last[sol]);
out<<a[sol]<<" ";
}
}
inline void Write()
{
out<<a[sol]<<"\n";
Write(sol);
out<<"\n";
out.close();
}
int main()
{
Read();
Normalization();
Solve();
Write();
return 0;
}