Pagini recente » Cod sursa (job #3032391) | Cod sursa (job #1418043) | Cod sursa (job #2175554) | Cod sursa (job #3149929) | Cod sursa (job #2062632)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int INF = 1e9;
void get_sol(int i, vector < int > &prev, vector < int > &elem) {
if (i == 0) {
return;
}
get_sol(prev[i], prev, elem);
cout << elem[i] << ' ';
}
int main() {
int n;
cin >> n;
vector < int > dp(n + 1);
vector < int > prev(n + 1);
vector < int > elem(n + 1);
dp[0] = 0;
elem[0] = -INF;
int last = 0;
for (int i = 1; i <= n; i ++) {
cin >> elem[i];
if (elem[i] > elem[dp[last]]) {
dp[++ last] = i;
prev[i] = dp[last - 1];
cout << elem[i] << ' ' << last << '\n';
}
else {
int st = 1;
int dr = last;
while (st <= dr) {
int mid = (st + dr) >> 1;
if (elem[dp[mid]] < elem[i]) {
st = mid + 1;
continue;
}
dr = mid - 1;
}
cout << elem[i] << ' ' << st << '\n';
dp[st] = i;
prev[i] = dp[st - 1];
}
}
cout << last << '\n';
get_sol(dp[last], prev, elem);
cout << '\n';
}