Pagini recente » Cod sursa (job #1847279) | Cod sursa (job #1945071) | Cod sursa (job #786204) | Cod sursa (job #1150504) | Cod sursa (job #2097822)
#include <fstream>
#include <algorithm>
#include <vector>
#define VAL 100005
#define F first
#define S second
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int N, M, i, j, v[VAL], poz, aib[VAL];
int fat[VAL], dp[VAL], cop[VAL];
pair <int, int> nr[VAL];
vector <int> SOL;
int zero(int X)
{
return X & (-X);
}
void Update(int X, int poz)
{
while (X<=N)
{
if (dp[aib[X]]<dp[poz])
aib[X]=poz;
X+=zero(X);
}
}
int Query(int X)
{
int mx=0;
while (X>0)
{
if (dp[aib[X]]>dp[mx])
mx=aib[X];
X-=zero(X);
}
return mx;
}
int main()
{
fin >> N;
for (i=1; i<=N; i++)
{
fin >> v[i];
nr[i].F=cop[i]=v[i];
nr[i].S=i;
}
sort(nr+1, nr+N+1);
for (i=1; i<=N; i++)
{
if (nr[i].F!=nr[i-1].F)
M++;
v[nr[i].S]=M;
}
M=0;
for (i=1; i<=N; i++)
{
fat[i]=Query(v[i]-1);
dp[i]=dp[fat[i]]+1;
if (M<dp[i])
{
M=dp[i];
poz=i;
}
Update(v[i], i);
}
fout << M << '\n';
while (poz!=0)
{
SOL.push_back(cop[poz]);
poz=fat[poz];
}
for (i=M-1; i>=0; i--)
fout << SOL[i] << " ";
fin.close();
fout.close();
return 0;
}