Pagini recente » Cod sursa (job #1455162) | Cod sursa (job #2375720) | Cod sursa (job #2364160) | Cod sursa (job #27131) | Cod sursa (job #2722520)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
vector <int> a, d, best, t;
int lenBest, pozMaxGlobal, maximGlobal;
void init() {
a = d = best = t = vector <int> (n + 1);
}
void read() {
f >> n;
init();
for(int i = 1; i <= n; ++i)
f >> a[i];
}
void solve() {
int st, dr, mid, ans;
for(int i = 1; i <= n; ++i) {
st = 1, dr = lenBest;
ans = 0;
while(st <= dr) {
mid = (st + dr) / 2;
if(a[best[mid]] > a[i])
dr = mid - 1;
else {
if(a[best[mid]] < a[i])
ans = mid;
st = mid + 1;
}
}
d[i] = d[best[ans]] + 1;
t[i] = best[ans];
if(d[i] >= maximGlobal) {
maximGlobal = d[i];
pozMaxGlobal = i;
}
if(ans == lenBest)
best[++lenBest] = i;
else if(a[best[ans]] < a[i])
best[ans + 1] = i;
}
}
void print(int pos) {
if(pos == 0)
return;
print(t[pos]);
g << a[pos] << " ";
}
int main()
{
read();
solve();
g << maximGlobal << "\n";
print(pozMaxGlobal);
}