Pagini recente » Cod sursa (job #1703660) | Cod sursa (job #2480392) | Cod sursa (job #1369272) | Cod sursa (job #1542542) | Cod sursa (job #1424424)
#include <iostream>
#include <deque>
#include <vector>
#include <cstring>
#include <algorithm>
#define step(x) (x & (-x))
using namespace std;
int N, i, A[100010], B[100010], cnt, last, sol, position, DP[100010], prevs[100010];
vector<pair<int,int> > V;
struct pereche
{
int val;
int pos;
} AIB[100010];
pereche query(int x)
{
pereche res;
res.val = 0;
res.pos = 0;
for( ; x; x -= step(x))
if(AIB[x].val > res.val)
res = AIB[x];
return res;
}
void update(int val, int pos, int x)
{
for(; x <= N; x+=step(x))
if(AIB[x].val < val)
{
AIB[x].val = val;
AIB[x].pos = pos;
}
}
void afiseaza(int x)
{
if(!DP[x])return;
afiseaza(prevs[x]);
printf("%d ", A[x]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &N);
for(i = 1; i <= N; i++)
{
scanf("%d", &A[i]);
V.push_back(make_pair(A[i], i));
}
sort(V.begin(), V.end());
last = -1;
cnt = 0;
for(vector<pair<int,int> >::iterator it = V.begin(); it != V.end(); it++)
{
if(it->first != last)
{
last = it->first;
cnt = cnt + 1;
}
B[it->second] = cnt;
}
for(i = 1; i <= N; i++)
{
pereche act = query(B[i] - 1);
DP[i] = act.val + 1;
if(sol < DP[i])
{
sol = DP[i];
position = i;
}
prevs[i] = act.pos;
update(DP[i], i, B[i]);
}
printf("%d\n", sol);
afiseaza(position);
return 0;
}