Pagini recente » Cod sursa (job #1401952) | Cod sursa (job #817258) | Cod sursa (job #1900424) | Cod sursa (job #1288634) | Cod sursa (job #2699355)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100000;
int dp[NMAX+5];
int v[NMAX+5];
int ml[NMAX+5]; /// pt lungimea i a subsirului crescator este poszitia valorii minime pt care exista un subsir crescator de lungime i
///cu aceasta pozitie ca final (ml inseamna minim pentru lungime)
int cautare_binara(int val, int st, int dr)
{
int last = 0;
while(st<=dr)
{
int mid = (st + dr)>>1;
if(ml[mid] < val)
{
last = mid;
st = mid + 1;
}
else dr = mid -1;
}
return last;
}
int main()
{
int n, i;
fin>>n;
for(i = 1;i<=n;i++)
{
fin>>v[i];
ml[i] = INT_MAX;
}
dp[1] = 1;
int lungime_maxima = 0;
for(i = 1;i <=n;i++)
{
int lsubsir = cautare_binara(v[i], 1, i-1);
if(lungime_maxima < lsubsir + 1)
lungime_maxima = lsubsir +1;
dp[i] = lsubsir + 1;
if(ml[lsubsir + 1] > v[i])
ml[lsubsir+1] = v[i];
}
stack<int> st;
fout<<lungime_maxima<<"\n";
for(int i=n; i >=1;i--)
{
if(dp[i] == lungime_maxima)
{
st.push(v[i]);
lungime_maxima--;
}
}
while(!st.empty())
{
fout<<st.top()<<" ";
st.pop();
}
return 0;
}