Pagini recente » Cod sursa (job #1120977) | Cod sursa (job #30444) | Cod sursa (job #334120) | Cod sursa (job #2896025) | Cod sursa (job #2236537)
#include<cstdio>
#define MAX_N 100000
using namespace std;
int v[MAX_N+1], Min[MAX_N+1], ant[MAX_N+1], n, len;
FILE* fout = fopen("scmax.out","w");
void read() {
FILE* fin = fopen("scmax.in","r");
fscanf(fin,"%d",&n);
for(int i = 1; i <= n; i++)
fscanf(fin,"%d",&v[i]);
fclose(fin);
}
int binarySearch(int Begin, int End, int val) {
int b = Begin, e = End, mid, pos = 0;
while(b <= e && !pos) {
mid = (b + e) >> 1;
if(v[Min[mid]] < val && val < v[Min[mid+1]])
pos = mid + 1;
else if(val > v[Min[mid]])
b = mid + 1;
else e = mid - 1;
}
return pos;
}
void SCM() {
int i, pos;
len = 1;
Min[1] = 1;
for(i = 2; i <= n; i++) {
if(v[i] > v[Min[len]]) {
len++;
Min[len] = i;
ant[i] = Min[len-1];
} else if(v[i] < v[Min[1]])
Min[1] = i;
else {
pos = binarySearch(1,len,v[i]);
Min[pos] = i;
ant[i] = Min[pos-1];
}
}
}
void printSCM(int x) {
if(x) {
printSCM(ant[x]);
fprintf(fout,"%d ",v[x]);
}
}
int main() {
read();
SCM();
fprintf(fout,"%d\n",len);
printSCM(Min[len]);
fprintf(fout,"\n");
fclose(fout);
return 0;
}