Pagini recente » Cod sursa (job #2173218) | Cod sursa (job #1333876) | Cod sursa (job #2677646) | Cod sursa (job #2237602) | Cod sursa (job #2170476)
#include <fstream>
#include <stack>
#include <vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int nmax = 100005;
int GetCeilIndex(int arr[], vector<int> &T, int l, int r, int key){
while((r - l) > 1){
int m = (l+r)/2;
if(arr[T[m]] >= key)r = m;
else l = m;
}
return r;
}
void LIS(int n, int arr[]){
if(n == 0)return;
vector<int>tailIndex(n, 0);
vector<int>prevIndex(n,-1);
int len = 1;
for(int i=1;i<n;++i)
if(arr[i] < arr[tailIndex[0]])
tailIndex[0] = i;
else if(arr[i] > arr[tailIndex[len-1]]){
prevIndex[i] = tailIndex[len-1];
tailIndex[len++] = i;
}
else {
int pos = GetCeilIndex(arr, tailIndex, -1, len-1, arr[i]);
prevIndex[i] = tailIndex[pos-1];
tailIndex[pos] = i;
}
g<<len<<'\n';
stack<int>s;
for(int i = tailIndex[len-1]; i>=0; i = prevIndex[i])
s.push(arr[i]);
while(!s.empty()){
g<<s.top()<<" ";
s.pop();
}
g<<'\n';
}
int arr[nmax];
int main()
{
int n;
f>>n;
for(int i=0;i<n;++i)
f>>arr[i];
LIS(n,arr);
return 0;
}