Pagini recente » Cod sursa (job #2814858) | Cod sursa (job #770607) | Cod sursa (job #592115) | Rating Muresan Natalia (____natalia) | Cod sursa (job #2967539)
#include<iostream>
#include<vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int NMAX = 1e5 + 10;
const int INF = 1 << 30;
vector<int> dp(NMAX,INF),maxim(NMAX);///dp[i] = valoarea minima in care se termina un subsir de lungime j
int v[NMAX];
int bin(int st,int dr,int val)
{
int ans = -1;
while(st <= dr)///caut prima pozitie mai mare decat val
{
int mid = st + (dr - st) / 2;
if(dp[mid] > val)
{
ans = mid;
dr = mid - 1;
}
else st = mid + 1;
}
return ans;
}
void afis(int l,int dr)
{
if(!l || !dr)
return;
while(dr >= 1)
{
if(maxim[dr] == l)
{
afis(l - 1,dr - 1);
cout << v[dr] << " ";
return;
}
dr--;
}
}
int main()
{
int n,x,dr = 0; cin >> n;
dp[0] = -INF;
for(int i = 1; i <= n ; i++)
{
cin >> x;
v[i] = x;
if(dp[dr] < x)
{
dp[++dr] = x;
maxim[i] = dr;
}
else
{
int pos = bin(0,dr,x);
if(pos == dr) pos--;
dp[pos] = x;
maxim[i] = pos;
}
}
cout << dr << '\n';
afis(dr,n);
}