Pagini recente » Cod sursa (job #2566857) | Cod sursa (job #1922677) | Cod sursa (job #2669737) | Cod sursa (job #738683) | Cod sursa (job #761255)
Cod sursa(job #761255)
#include <stdio.h>
#define MAX_TREE 262144
#define MAX_LENGTH 100001
int n, seq[MAX_LENGTH], best[MAX_LENGTH], predecessor[MAX_LENGTH], tree[MAX_TREE];
int position;
int max, ll, rr, value;
void update(int l, int r, int v)
{
if(l == r)
{
tree[v] = position;
}
else
{
int middle = (r - l) / 2 + l;
if(position <= middle) update(l, middle, 2 * v);
else update(middle + 1, r, 2 * v + 1);
if(best[ tree[2 * v] ] < best[ tree[2 * v + 1] ])
tree[v] = tree[2 * v + 1];
else
tree[v] = tree[2 * v];
}
}
void querry(int l, int r, int v)
{
if(ll <= l && r <= rr && seq[ tree[v] ] < value)
{
if(best[max] < best[tree[v]])
max = tree[v];
}
else if (l < r)
{
int middle = (r - l) / 2 + l;
if(ll <= middle) querry(l, middle, 2 * v);
if(middle < rr) querry(middle + 1, r, 2 * v + 1);
}
}
void print(FILE *file, int pos)
{
if(predecessor[pos] != 0)
print(file, predecessor[pos]);
fprintf(file, "%d ", seq[pos]);
}
int main()
{
FILE *in = fopen("scmax.in", "r");
FILE *out = fopen("scmax.out", "w");
int i, maxSeq = 0, maxPos;
fscanf(in, "%d", &n);
for(i = 1; i <= n; i++)
fscanf(in, "%d", &seq[i]);
for(i = 1; i <= n; i++)
{
position = i;
value = seq[i];
ll = 1;
rr = i - 1;
max = 0;
querry(1, n, 1);
best[i] = best[max] + 1;
predecessor[i] = max;
if(best[i] > maxSeq)
{
maxSeq = best[i];
maxPos = i;
}
update(1, n, 1);
}
fprintf(out, "%d\n", maxSeq);
print(out, maxPos);
fprintf(out, "\n");
fclose(in);
fclose(out);
return 0;
}