Pagini recente » Cod sursa (job #1096779) | Cod sursa (job #2776161) | Cod sursa (job #2438818) | Cod sursa (job #2860263) | Cod sursa (job #951663)
Cod sursa(job #951663)
#include <fstream>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define in "subsir2.in"
#define out "subsir2.out"
#define N 5005
#define oo -(1 << 30)
vector <int> tmp, sol;
int v[N], last[N], bst[N], MIN[N], tata[N], n, l = 1;
void cmp () {
//cout << "\nChecking...\n";
if (!sol.size())
sol = tmp;
else {
int i = sol.size() - 1;
for (; i >= 0; --i)
if (v[sol[i]] > v[tmp[i]])
break;
if (i >= 0)
sol = tmp;
}
}
void Create (int i) {
tmp.push_back(i);
if (tata[i])
Create (tata[i]);
else
cmp();
tmp.pop_back();
}
int bs (int x) {
int lo = 0, hi = l;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (v[last[mid]] < x && v[last[mid+1]] >= x)
return mid;
else
if (v[last[mid+1]] < x)
lo = mid + 1;
else
hi = mid - 1;
}
return l;
}
int main () {
ifstream fin (in);
v[N-1] = -oo;
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
MIN[i] = N-1;
}
fin.close();
bst[1] = last[1] = 1;
v[0] = oo;
MIN[bst[1]] = 1;
for (int i = 2; i <= n; ++i)
if (v[i] >= v[1]) {
int c = bs (v[i]);
bst[i] = c + 1;
last[c + 1] = i;
if (v[i] < v[MIN[bst[i]]])
MIN[bst[i]] = i;
tata[i] = MIN[bst[i]-1];
if (l < c + 1)
l = c + 1;
}
ofstream fout (out);
fout << l << "\n";
for (int i = 1; i <= last[l]; ++i)
if (bst[i] == l) {
Create (i);
//cout << "Status: ";
//for (int i = sol.size()-1; i >= 0; --i)
// cout << v[sol[i]] << " ";
//cout << "\n";
}
for (int i = sol.size()-1; i >= 0; --i)
fout << sol[i] << " ";
fout.close();
return 0;
}