Pagini recente » Cod sursa (job #324657) | Cod sursa (job #2676993) | Cod sursa (job #469055) | Cod sursa (job #702626) | Cod sursa (job #2659020)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int lim=1e5+4;
struct node
{
int bst;
int unde;
}tree[4*lim];
int v[lim];
int srt[lim];
int poz[lim];
int opt[lim];
int last[lim];
bool mycmp(int a,int b)
{
return v[a]<v[b];
}
node add(node a,node b)
{
if(a.bst>b.bst)
return a;
if(a.bst<b.bst)
return b;
return a;
}
void update(int nod,int l,int r,int poz)
{
if(l==r)
{
tree[nod]={opt[srt[l]],srt[l]};
return ;
}
int med=(l+r)/2;
if(poz<=med) update(2*nod,l,med,poz);
else update(2*nod+1,med+1,r,poz);
tree[nod]=add(tree[2*nod],tree[2*nod+1]);
}
node query(int nod,int l,int r,int val)
{
if(v[srt[r]]<val) return tree[nod];
int med=(l+r)/2;
if(v[srt[med+1]]>=val) return query(2*nod,l,med,val);
return add(tree[2*nod],query(2*nod+1,med+1,r,val));
}
stack<int> st;
int main()
{
int n;
in>>n;
for(int i=1;i<=n;++i)
{
in>>v[i];
srt[i]=i;
}
sort(srt+1,srt+n+1,mycmp);
for(int i=1;i<=n;++i)
poz[srt[i]]=i;
int maxim=0,fin=0;
for(int i=1;i<=n;++i)
{
if(v[i]==v[srt[1]])
{
opt[i]=1;
last[i]=0;
update(1,1,n,poz[i]);
if(opt[i]>maxim)
maxim=opt[i],fin=i;
continue;
}
node ans=query(1,1,n,v[i]);
opt[i]=ans.bst+1;
last[i]=ans.unde;
update(1,1,n,poz[i]);
if(opt[i]>maxim)
maxim=opt[i],fin=i;
}
out<<maxim<<'\n';
for(int i=1;i<=maxim;++i)
{
st.push(v[fin]);
fin=last[fin];
}
while(!st.empty())
out<<st.top()<<' ',st.pop();
return 0;
}