Cod sursa(job #1826331)

Utilizator MithrilBratu Andrei Mithril Data 10 decembrie 2016 12:44:31
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#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);
        }
    }
}