Pagini recente » Cod sursa (job #81553) | Cod sursa (job #2238713) | Cod sursa (job #2420894) | Cod sursa (job #264077) | Cod sursa (job #3351033)
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX=100007;
int n;
int dp[NMAX];//dp[i]=val minima pe care o putem obtine pt lung i
int ind[NMAX];
int v[NMAX];
int maxxind;
int rev[NMAX];
int bs(int val)// cea mai din dreapta val strict mai mica
{
int st=0;
int dr=maxxind;
int ras;
while(st<=dr)
{
int mij=(st+dr)/2;
if(dp[mij]<val)
{
ras=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
return ras;
}
int main()
{
int fini=-1;
in>>n;
maxxind=0;
for(int i=1;i<=n;i++)
{
in>>v[i];
int poz=bs(v[i]);
dp[poz+1]=v[i];
ind[poz+1]=i;
rev[i]=ind[poz];
if(maxxind<poz+1)
{
maxxind=poz+1;
fini=i;
}
}
out<<maxxind<<"\n";
int varpoz=fini;
vector<int> ras;
while(varpoz!=0)
{
ras.push_back(v[varpoz]);
varpoz=rev[varpoz];
}
reverse(ras.begin(),ras.end());
for(auto w:ras)
{
out<<w<<" ";
}
}