Pagini recente » Cod sursa (job #2295368) | Cod sursa (job #382234) | Cod sursa (job #2307797) | Cod sursa (job #2415290) | Cod sursa (job #2343299)
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAX_SIZE = 100005;
int v[MAX_SIZE];
int endIndex[MAX_SIZE]; ///sfarsitul unui sc de lungime i
int predIndex[MAX_SIZE]; ///predecesorul nodului i in scm
int binarySearch(int left, int right, int val){
int mid;
while(left <= right){
mid = (left + right) / 2;
if(v[ endIndex[mid] ] >= val)
right = mid - 1;
else
left = mid + 1;
}
return right;
}
void printSCMax(int index){
if(index > 0){
printSCMax(predIndex[index]);
out<<v[index]<<" ";
}
}
int main()
{
int n, maxLen = 1, pos;
in>>n;
for(int i=1;i<=n;i++)
in>>v[i];
in.close();
predIndex[1] = 0;
endIndex[1] = 1;
for(int i=2;i<=n;i++)
if(v[i] <= v[ endIndex[1] ])
endIndex[1] = i;
else if(v[i] > v[ endIndex[maxLen] ]){
predIndex[i] = endIndex[maxLen];
endIndex[++maxLen] = i;
}
else{
pos = binarySearch(1, maxLen, v[i]) + 1;
predIndex[i] = endIndex[pos - 1];
endIndex[pos] = i;
}
out<<maxLen<<"\n";
printSCMax(endIndex[maxLen]);
out.close();
return 0;
}