Cod sursa(job #2230432)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 10 august 2018 10:13:02
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;




const int N=1000000+5;
int n,k,v[N];
int sol[N],cnts=0;
int st[N],vf=0;
bool is[N];

inline void b(int x) /// b in stiva
{
    if(vf==0)
    {
        st[++vf]=x;
        return;
    }
    if(x==st[vf])
    {
        st[vf]++;
        while(vf>=2 && st[vf]==st[vf-1])
        {
            vf--;
            st[vf]++;
        }
        return;
    }
    if(st[vf]>x)
    {
        st[++vf]=x;
        return;
    }
    while(st[vf]<x)
    {
        sol[++cnts]=st[vf];
        st[vf]++;
        while(vf>=2 && st[vf]==st[vf-1])
        {
            vf--;
            st[vf]++;
        }
    }
    st[++vf]=x;
    while(vf>=2 && st[vf]==st[vf-1])
    {
        vf--;
        st[vf]++;
    }
}

bool spec[N];
int cate[N];
int mi[N];
int aux[N];
bool is2[N];
int aux3[N];

int main()
{
    freopen("zalmoxis.in","r",stdin);
    freopen("zalmoxis.out","w",stdout);
   // ios_base::sync_with_stdio(false); cin.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        b(x);
        sol[++cnts]=x;
        is[cnts]=1;
    }
    while(vf>1)
    {
        sol[++cnts]=st[vf];
        st[vf]++;
        while(vf>=2 && st[vf]==st[vf-1])
        {
            vf--;
            st[vf]++;
        }
    }
    while(st[vf]!=30)
    {
        sol[++cnts]=st[vf];
        st[vf]++;
    }
    int lft=n+k-cnts;
    int ind=0;
    int p2=0;
    for(int i=1;i<=cnts;i++)
    {
        cate[i]=1;
        mi[i]=sol[i];
        if(is[i])
        {
            aux[++p2]=mi[i]; is2[p2]=1;
            continue;
        }
        int sz=(1<<(sol[i]-1));
        int cnt=1;
        for(int j=sz;j>=1;j/=2)
        {
            if(j-1<=lft)
            {
                lft-=(j-1);
                mi[i]=cnt;
                cate[i]=j;
                break;
            }
            cnt++;
        }
        for(int j=1;j<=cate[i];j++)
            aux[++p2]=mi[i],is2[p2]=0;
    }
    while(lft>0)
    {
    cnts=p2;
    for(int i=1;i<=cnts;i++)
    {
        sol[i]=aux[i];
        is[i]=is2[i];
    }
    p2=0;
    for(int i=1;i<=cnts;i++)
    {
        cate[i]=1;
        mi[i]=sol[i];
        if(is[i])
        {
            aux[++p2]=mi[i]; is2[p2]=1;
            continue;
        }
        int sz=(1<<(sol[i]-1));
        int cnt=1;
        for(int j=sz;j>=1;j/=2)
        {
            if(j-1<=lft)
            {
                lft-=(j-1);
                mi[i]=cnt;
                cate[i]=j;
                break;
            }
            cnt++;
        }
        for(int j=1;j<=cate[i];j++)
            aux[++p2]=mi[i],is2[p2]=0;
    }
    }
   // cout<<lft<<"\n";
    for(int i=1;i<=p2;i++)
    {
        cout<<aux[i]<<" ";
    }
    cout<<"\n";
    return 0;
}
/**

2

**/