Pagini recente » Cod sursa (job #1799043) | Cod sursa (job #1815751) | Cod sursa (job #1170840) | Cod sursa (job #1135897) | Cod sursa (job #1826331)
#include <bits/stdc++.h>
#define LMAX 100010
using namespace std;
typedef unsigned int uint;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct Node
{
int lungimeMaxSubSir;
vector<int> componenteSubSir;
};
vector<Node> arbore;
void build(int,int,int);
int n,x;
int main()
{
fin>>n;
arbore.resize(4*(n+10));
build(1,1,n);
fout<<arbore[1].lungimeMaxSubSir<<'\n';
for(auto i:arbore[1].componenteSubSir)fout<<i<<' ';
}
void build(int nod,int st,int dr)
{
if(st==dr)
{
fin>>x;
arbore[nod].componenteSubSir.push_back(x);
arbore[nod].lungimeMaxSubSir=1;
return;
}
int m=(st+dr)>>1,leftNode=nod<<1,rightNode=nod<<1|1;
build(leftNode,st,m);
build(rightNode,m+1,dr);
if(arbore[leftNode].componenteSubSir.back()<arbore[rightNode].componenteSubSir.front())
{
arbore[nod].lungimeMaxSubSir=arbore[leftNode].lungimeMaxSubSir+arbore[rightNode].lungimeMaxSubSir;
for(auto i:arbore[leftNode].componenteSubSir)
arbore[nod].componenteSubSir.push_back(i);
for(auto i:arbore[rightNode].componenteSubSir)
arbore[nod].componenteSubSir.push_back(i);
}
else if(arbore[leftNode].componenteSubSir.back()==arbore[rightNode].componenteSubSir.front())
{
arbore[nod].lungimeMaxSubSir=arbore[leftNode].lungimeMaxSubSir+arbore[rightNode].lungimeMaxSubSir-1;
for(auto i:arbore[leftNode].componenteSubSir)
arbore[nod].componenteSubSir.push_back(i);
for(vector<int>::iterator it=arbore[rightNode].componenteSubSir.begin()+1;it!=arbore[rightNode].componenteSubSir.end();it++)
arbore[nod].componenteSubSir.push_back(*it);
}
else
{
if(arbore[leftNode].lungimeMaxSubSir>arbore[rightNode].lungimeMaxSubSir)
{
arbore[nod].lungimeMaxSubSir=arbore[leftNode].lungimeMaxSubSir;
for(auto i:arbore[leftNode].componenteSubSir)
arbore[leftNode].componenteSubSir.push_back(i);
}
else if(arbore[rightNode].lungimeMaxSubSir>arbore[leftNode].lungimeMaxSubSir)
{
arbore[nod].lungimeMaxSubSir=arbore[rightNode].lungimeMaxSubSir;
for(auto i:arbore[rightNode].componenteSubSir)
arbore[nod].componenteSubSir.push_back(i);
}
else
{
int selectNode = (arbore[leftNode].componenteSubSir.back()<arbore[rightNode].componenteSubSir.back()) ? leftNode:rightNode;
arbore[nod].lungimeMaxSubSir=arbore[selectNode].lungimeMaxSubSir;
for(auto i:arbore[selectNode].componenteSubSir)
arbore[nod].componenteSubSir.push_back(i);
}
}
}