Pagini recente » Diferente pentru problema/interclas intre reviziile 14 si 5 | Cod sursa (job #2431881) | Cod sursa (job #586066) | Cod sursa (job #120811) | Cod sursa (job #3321463)
#include <bits/stdc++.h>
using namespace std;
vector<int> scm(100005); /// scm[i]= pozitia in sirul initial a elemetului minim cu care se poate termina un subsir strict crescator de i elemente
int v[100005],sol[100005];
unordered_map<int,int> last; ///retine elementul anterior in sir, pentru a se putea construi
int main()
{
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int N,nr,cnt=1;
cin>>N;
for(int i=1; i<=N; i++)
{
cin>>nr;
v[i]=nr;
if(i==1)
{
scm[1]=nr;
continue;
}
//cout<<scm.back()<<' ';
if(nr > scm.back())
{
last[nr]=scm.back();
scm.push_back(nr);
cnt++;
}
else
{
/// caut primul nr mai mare sau egal cu nr si il inlocuiesc
int poz = lower_bound(scm.begin()+1,scm.end(),nr) -scm.begin();
scm[poz]=nr;
// cout<<scm[1]<<' ';
last[nr]=scm[poz-1];
}
}
cout<<cnt-1<<'\n';
nr=scm.back();
int c=cnt;
while(c--)
{
sol[c]=nr;
nr=last[nr];
}
for(int i=1;i<cnt;i++)
{
cout<<sol[i]<<' ';
}
return 0;
}