Pagini recente » Cod sursa (job #2794896) | Cod sursa (job #699118) | Cod sursa (job #3187565) | Cod sursa (job #1627822) | Cod sursa (job #795012)
Cod sursa(job #795012)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#define DN 100005
using namespace std;
int n,v[DN],bst[DN],pre[DN],ind[DN],aib[DN],paib[DN],rez[DN],sz;
set<int> s;
bool cmp(int a, int b) {
return v[a]<v[b];
}
inline int lsb(int n) {
return (n&(n-1))^n;
}
void query(int i) {
int p=i;
int vm=1,pm=i;
for(;i>0;i-=lsb(i)) if(aib[i]+1>vm) {
vm=aib[i]+1;
pm=paib[i];
}
pre[p]=pm; bst[p]=vm;
}
void ins(int i,int vl,int poz) {
for(;i<=n;i+=lsb(i)) if(vl>aib[i]) {
aib[i]=vl;
paib[i]=poz;
}
}
int main()
{
ifstream f("scmax.in");
ofstream g("scmax.out");
f>>n;
for(int i=1; i<=n; ++i) {
f>>v[i];
bst[i]=1;
ind[i]=pre[i]=i;
}
sort(ind+1,ind+n+1,cmp);
int sol=0,psol;
for(int i=1; i<=n; ++i) {
if(s.find(v[ind[i]])!=s.end()) continue;
s.insert(v[ind[i]]);
query(ind[i]);
ins(ind[i],bst[i],ind[i]);
if(bst[i]>sol) {
sol=bst[i];
psol=ind[i];
}
}
g<<sol<<'\n';
//cout<<psol;
for(;psol!=pre[psol];rez[++sz]=v[psol],psol=pre[psol]);
for(int i=sz; i>0; --i) g<<rez[i]<<' ';
return 0;
}