Pagini recente » Cod sursa (job #3174550) | Cod sursa (job #1923092) | Cod sursa (job #2456254) | Cod sursa (job #1700181) | Cod sursa (job #1703218)
#include <iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<climits>
using namespace std;
int aux[100005],best[100005],i,n,x,mx,val,best2[100005];
vector<int> sol;
struct key
{
int a,b;
}v[100005];
bool comp(key x,key y)
{
if(x.a==y.a) return x.b>y.b;
return x.a<y.a;
}
inline int lbit(int x)
{
return ((x^(x-1))&x);
}
void update(int x,int val)
{
for(x;x<=n;x+=lbit(x))
best[x]=max(best[x],val);
}
int query(int x)
{
int maxim=0;
for(x;x>0;x-=lbit(x))
if(best[x]>maxim) maxim=best[x];
return maxim;
}
int main()
{
ifstream f("scmax.in");
ofstream g("scmax.out");
f>>n;
for(i=1;i<=n;i++)
{
f>>v[i].a;
v[i].b=i;
aux[i]=v[i].a;
}
sort(v+1,v+n+1,comp);
int valoare;
for(i=1;i<=n;i++)
{
valoare=query(v[i].b)+1;
update(v[i].b,valoare);
best2[v[i].b]=valoare;
if(valoare>mx){mx=valoare;}
}
g<<mx<<'\n';
val=INT_MAX;
for(i=n;i>=1;i--)
{
if(aux[i]<val&&best2[i]==mx)
{sol.push_back(aux[i]);val=aux[i];mx--;}
}
for(i=sol.size()-1;i>=0;i--) g<<sol[i]<<' ';
return 0;
}