Pagini recente » Cod sursa (job #3152922) | Cod sursa (job #268895) | Cod sursa (job #998920) | Cod sursa (job #3266170) | Cod sursa (job #2514851)
//Alex Postu :^)
#include <algorithm>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <cstring>
#include <bitset>
using namespace std;
//#include <iostream>
#include <fstream>
//ifstream cin ("input.in"); ofstream cout ("output.out");
ifstream cin ("scmax.in"); ofstream cout ("scmax.out");
static const int NMAX = 1e5+5;
static const int valmax = 2e9+5;
int v[NMAX];
int dp[NMAX];
int maxLen[NMAX];
int ans[NMAX];
int binSearch (int val, int len) {
int first = 1;
int last = len;
int ans = 0;
while ( first <= last ) {
int mid= first+((last-first)>>1);
if ( dp[mid] < val ) {
first = mid+1;
ans = mid;
}
else {
last = mid-1;
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin>>n;
for ( int i = 1; i <= n; ++i ) {
cin>>v[i];
}
for ( int i = 1; i <= n; ++i ) {
dp[i] = valmax;
}
int scm = 0;
for ( int i = 1; i <= n; ++i ) {
int curLen = binSearch(v[i], scm);
dp[curLen+1] = min(v[i], dp[curLen+1]);
scm = max(scm, curLen+1);
maxLen[i] = curLen+1;
}
int pos = scm;
int idx = 0;
for ( int i = n; i >= 1; --i ) {
if ( maxLen[i] == pos ) {
ans[++idx] = v[i];
pos--;
}
}
for ( int i = idx; i >= 1; --i ) {
cout<<ans[i]<<" ";
}
}