Pagini recente » Cod sursa (job #1480871) | Cod sursa (job #897840) | Cod sursa (job #1456685) | Cod sursa (job #1641034) | Cod sursa (job #1877530)
#include <cstdio>
using namespace std;
FILE *f, *g;
int crChar = 4096;
const int buffSize = 4096;
char buff[4100];
bool isDigit(char c)
{
if(c >= '0' && c <= '9')
return 1;
return 0;
}
void refillBuff()
{
crChar = 0;
fread(buff, 1, buffSize, f);
}
char getCr()
{
if(crChar == buffSize)
refillBuff();
return buff[crChar ++];
}
int getNr()
{
char c = getCr();
int nr = 0, sign = 1;
while(isDigit(c) == 0 && c != '-')
c = getCr();
while(c == '-')
{
sign = -1;
c = getCr();
}
while(isDigit(c) == 1)
{
nr = nr * 10 + c - '0';
c = getCr();
}
return nr * sign;
}
int n;
int v[100001];
void readFile()
{
f = fopen("scmax.in", "r");
n = getNr();
int i;
for(i = 1; i <= n; i ++)
{
v[i] = getNr();
}
fclose(f);
}
int dp[100001];
int k;
int urm[100001];
int lst[100001];
int idx[100001];
int mx, pozx;
int cautBin(int n)
{
int i = 0;
int pas = 1 << 16;
while(pas != 0)
{
if(i + pas <= k && lst[i + pas] >= n)
i += pas;
pas /= 2;
}
return i + 1;
}
void solve()
{
int i;
int poz;
for(i = 1; i <= n; i ++)
{
poz = cautBin(v[i]);
lst[poz] = v[i];
dp[i] = dp[idx[poz]] + 1;
urm[i] = idx[poz];
idx[poz] = i;
if(poz == k + 1)
k ++;
if(dp[i] > mx)
{
mx = dp[i];
pozx = i;
}
}
}
void afisare(int i)
{
if(urm[i] != 0)
afisare(urm[i]);
fprintf(g, "%d ", v[i]);
}
void printFile()
{
g = fopen("scmax.out", "w");
fprintf(g, "%d\n", mx);
afisare(pozx);
fprintf(g, "\n");
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}