Pagini recente » Cod sursa (job #3258586) | Cod sursa (job #1932576) | Cod sursa (job #3268931) | Cod sursa (job #1439705) | Cod sursa (job #3003731)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int inf = 2e9 + 5;
int v[nmax+5];
int dp[nmax+5];
int len[nmax+5];
int prv[nmax+5];
int pos[nmax+5];
// dp[i] - elementul minim cu care se termina un subsir de lungimea i
// dp - crescator
// dp: 1 2 3 4 5
// 3 6 10 15 20
// 13
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
int n; f >> n;
for(int i=1; i<=n; i++) dp[i] = inf;
int mx = 0, ret;
for(int i=1; i<=n; i++) {
f >> v[i];
int st = 1;
int dr = n;
int ans = 0;
while(st <= dr) {
int mid = (st + dr) / 2;
if(dp[mid] < v[i]) {
ans = mid;
st = mid + 1;
}
else
dr = mid-1;
}
len[i] = ans + 1;
dp[ans+1] = v[i];
pos[ans+1] = i;
prv[i] = pos[ans];
if(len[i] > mx) {
mx = len[i];
ret = i;
}
}
g << mx << "\n";
vector<int> sol;
for(int i=1; i<=mx; i++) {
sol.emplace_back(v[ret]);
ret = prv[ret];
}
reverse(sol.begin(), sol.end());
for(auto i : sol) g << i << " ";
return 0;
}