Pagini recente » Cod sursa (job #1072670) | Cod sursa (job #1688536) | Cod sursa (job #2143524) | Cod sursa (job #1504028) | Cod sursa (job #2216742)
#include <fstream>
#include <conio.h>
using namespace std;
#define MAX_N 100005
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
struct Node
{
int accum = 0;
int minim;
};
Node tree[MAX_N * 4];
int maxAccum = 0;
void Insert(int node, int left, int right, int pos, Node& value)
{
if (left == right)
{
tree[node] = value;
}
else
{
int middle = (left + right) / 2.0f;
if(pos <= middle)
{
Insert(node * 2, left, middle, pos, value);
}
else
{
Insert(node * 2 + 1, middle + 1, right, pos, value);
}
Node maxNode;
if (tree[node * 2].accum > tree[node * 2 + 1].accum)
{
maxNode = tree[node * 2];
}
else
{
maxNode = tree[node * 2 + 1];
}
tree[node] = maxNode;
}
}
void Query(int node, int left, int right, int a, int b, int val)
{
if (a <= left && right <= b)
{
if (val > tree[node].minim)
{
if (tree[node].accum > maxAccum)
{
maxAccum = tree[node].accum;
}
}
}
else
{
int middle = (left + right) / 2.0f;
if (a <= middle)
{
Query(node * 2, left, middle, a, b, val);
}
if(b > middle)
{
Query(node * 2 + 1, middle + 1, right, a, b, val);
}
}
}
int main(void)
{
fin >> n;
for (int i = 1; i <= n; i++)
{
int value;
fin >> value;
Node node;
if (i == 1)
{
node.accum = 0;
}
else
{
maxAccum = 0;
Query(1, 1, n, 1, i - 1, value);
node.accum = maxAccum + 1;
}
node.minim = value;
Insert(1, 1, n, i, node);
}
//for (int i = 1; i < 2 * n; i++)
//{
//printf("%d ", tree[i].accum);
//}
fout << tree[1].accum;
_getch();
return 0;
}