Pagini recente » Cod sursa (job #1016855) | Cod sursa (job #1316298) | Cod sursa (job #397873) | Cod sursa (job #2809237) | Cod sursa (job #3289256)
#include <bits/stdc++.h>
using namespace std;
int a[100001]; //vectorul citit
vector<int> LIS; //salvam in LIS pozitiile elementelor sirului crescator
int cautare_binara(int val, int dr)
{
int poz=0, st=0;
while(st<=dr)
{
int mij=st+(dr-st)/2;
if(val<=a[LIS[mij]])
{
poz=mij;
dr=mij-1;
}
else
st=mij+1;
}
return poz;
}
int main()
{
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
cin >> n;
for(int i=0; i<n; i++)
cin >> a[i]; //citim vectorul
LIS.reserve(n);
for(int i=0; i<n; i++)
{
if(LIS.empty())
LIS.push_back(i);
else
{
if(a[i]>a[LIS.back()])
LIS.push_back(i);
else
{
int pozitie=cautare_binara(a[i], LIS.size()-1);
LIS[pozitie]=i;
}
}
}
cout << LIS.size() << "\n"; //afisam lungimea subsirului
//calculam subsirul care este ordonat strict crescator si care are lungimea maxima
int pozitie=LIS.back(); //pozitia in vectorul a
a[n]=2000000001; LIS.push_back(n); //adaugam la finalul vectorului un numar care stim sigur ca este mai mare ca toate cele din vector
for(int i=LIS.size()-2; i>=0; i--)
{
while(pozitie>=0)
{
if(a[pozitie]>=a[LIS[i]] && a[pozitie]<a[LIS[i+1]])
break;
pozitie--;
}
LIS[i]=pozitie;
pozitie--;
}
LIS.pop_back(); //eliminam ultimul element (cel adaugat mai devreme la final pentru a calcula mai usor pozitiile)
for(auto& element : LIS) //afisam elementele subsirului crescator
cout << a[element] << " ";
return 0;
}