Pagini recente » Cod sursa (job #1765641) | Cod sursa (job #872967) | Cod sursa (job #1631368) | Cod sursa (job #579050) | Cod sursa (job #1655705)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> a, previous, BST;
int N, ans, bMax;
void read();
void solve();
int binarySearch(int st, int dr, int val);
void write();
void buildSolution(int last);
int main()
{
read();
solve();
write();
return 0;
}
void buildSolution(int last)
{
if(last > 0)
{
buildSolution(previous[last]);
cout<<last<<' ';
}
}
void write()
{
cout<<BST.size()-1<<'\n';
buildSolution(BST.back());
cout<<'\n';
}
void solve()
{
for(int i=2; i<=N; ++i)
if(a[i] > a[BST.back()]) { //elementul a[i] poate fi pus la capatul celui mai lung subsir
previous[i] = BST[BST.size() - 1];
BST.push_back(i);
}
else {
bMax = binarySearch(0, BST.size()-1, a[i]);
BST[bMax + 1] = i;
previous[i] = BST[bMax];
}
}
int binarySearch(int st, int dr, int val)
{
int mij;
while(st <= dr) {
mij = (dr-st)/2 + st;
if(val > a[BST[mij]]) {
st = mij+1;
bMax = mij;
}
else
dr = mij-1;
}
return bMax;
}
void read()
{
freopen("scmax.in", "rt", stdin);
freopen("scmax.out", "wt", stdout);
scanf("%d", &N);
a.assign(N+2, 0);
BST.assign(2, 0);
previous.assign(N+2, -1);
for(int i=1; i<=N; ++i)
scanf("%d", &a[i]);
BST[1] = 1;
}