Pagini recente » Cod sursa (job #2148004) | Cod sursa (job #2756511) | Cod sursa (job #282804) | Cod sursa (job #382345) | Cod sursa (job #2964237)
#include <fstream>
using namespace std;
const int MAX = 1e5 + 1;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int dp[MAX] , a , ans , n , v[MAX] , poz , pre[MAX];
struct{
int val , poz;
} aint[4*MAX];
void update( int nod , int st , int dr , int poz){
if(st == dr){
aint[nod].val = dp[st];
aint[nod].poz = st;
}else{
int mij = (st+dr)/2;
if(poz <= mij) update(nod*2,st,mij,poz);
else update(nod*2+1,mij+1,dr,poz);
if(aint[nod*2].val > aint[nod*2+1].val) aint[nod] = aint[nod*2];
else aint[nod] = aint[nod*2+1];
}
}
void query( int nod , int st , int dr , int value){
if( v[aint[nod].poz] < value ){
if(aint[nod].val > ans){
ans = aint[nod].val;
poz = aint[nod].poz;
}
}else{
int mij = (st+dr)/2;
query(nod*2,st,mij,value);
query(nod*2+1,mij+1,dr,value);
}
}
void afisarerec( int x ){
if(x == 0) return;
afisarerec(pre[x]);
cout << v[x] << ' ';
}
int main()
{
cin >> n;
int maxim = 0;
int pozmax;
for(int i = 1 ; i <= n ; i++){
cin >> v[i];
query(1,1,n,v[i]);
pre[i] = poz;
dp[i] = ans + 1;
if(dp[i] > maxim){
maxim = dp[i];
pozmax = i;
}
ans = 0;
poz = 0;
update(1,1,n,i);
}
cout << maxim << '\n';
afisarerec(pozmax);
return 0;
}