Pagini recente » Cod sursa (job #1210770) | Cod sursa (job #1982488) | Cod sursa (job #3155750) | Cod sursa (job #703605) | Cod sursa (job #827571)
Cod sursa(job #827571)
#include<fstream>
#include<malloc.h>
#include<algorithm>
#define zeros(x) ((x)&(-x))
using namespace std;
ifstream reader("scmax.in");
ofstream writer("scmax.out");
void update(int *aib, int *values, int n, int i, int ind)
{
for(; i <= n; i += zeros(i))
if(values[ind] > values[aib[i]])
aib[i] = ind;
}
int query(int *aib, int *values, int ind)
{
int max = 0;
for(int i = ind; i > 0; i-=zeros(i))
if(values[aib[i]] > values[max])
max = aib[i];
return max;
}
void afisSol(int *prev, int *sortedSir, int *sir, int current)
{
if(prev[current])
afisSol(prev, sortedSir, sir, prev[current]);
writer << sortedSir[sir[current]] << ' ';
}
int main()
{
int *sir, *sortedSir, *aib, *pos, *val, *prec;
int n, nSorted = 0, maxx = 1;
reader >> n;
sir = new int[n + 1];
sortedSir = new int[n + 1];
pos = new int[n + 1];
val = (int*) calloc(n + 1, sizeof(int));
aib = (int*) calloc(n + 1, sizeof(int));
prec = (int*) calloc(n + 1, sizeof(int));
for(int i = 1; i <= n; i++)
{
reader >> sir[i];
sortedSir[i] = sir[i];
}
sort(sortedSir + 1, sortedSir + n + 1);
for(int i = 1; i <= n; i++)
if(sortedSir[i] != sortedSir[i - 1])
sortedSir[++nSorted] = sortedSir[i];
for(int i = 1; i <= n; i++)
sir[i] = lower_bound(sortedSir + 1, sortedSir + nSorted, sir[i]) - sortedSir;
for(int i = 1; i <= n; i++)
{
prec[i] = query(aib, val, sir[i] - 1);
val[i] = val[prec[i]] + 1;
if(val[i] > val[maxx])
maxx = i;
update(aib, val, n, sir[i], i);
}
writer << val[maxx] << '\n';
afisSol(prec, sortedSir, sir, maxx);
writer << '\n';
return 0;
}