Cod sursa(job #2423459)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 21 mai 2019 13:46:17
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin ("elimin_prime.in");
ofstream fout ("elimin_prime.out");

const int N = 1E6 + 2;

bool sieve[N];
void Create_Sieve ()
{
    sieve[1] = sieve[2] = 1;
    int i, j;
    for (i = 4; i <= N; i += 2)
        sieve[i] = 1;
    for (i = 3; i * i <= N; i += 2)
        if (sieve[i] == 0)
            for (j = i * i; j <= N; j += 2 * i)
                sieve[i] = 1;
}

struct nod
{
    int info;
    nod *leg;
};

nod *L, *U;
int n;
int ans[N], k;

void Delete (nod * p)
{
    nod *q;
    q = p -> leg;
    p -> leg = q -> leg;
}

void InsEnd (nod *p, int x)
{
    nod *q;
    q = new nod;
    q -> info = x;
    q -> leg = p -> leg;
    p -> leg = q;
    U = q;
}

void DeleteInside (nod *p)
{
    nod *q;
    q = p -> leg;
    p -> leg = q -> leg;
    delete q;
}

void DeleteFirst()
{
    nod *p;
    p = L;
    L = L -> leg;
    delete p;
}

void Solve ()
{
    int x, cnt;
    fin >> n;
    fin >> x;
    L = new nod;
    U = new nod;
    L -> info = x;
    L -> leg = NULL;
    for (int i = 2; i <= n; i++)
    {
        fin >> x;
        InsEnd (U, x);
    }
    while (k < n)
    {
        cnt = 1;
        nod *p, *r;
        for (p = L; p != NULL; p = p -> leg)
        {
            if (cnt <= 3)
            {
                ans[++k] = L -> info;
                DeleteFirst();
            }
            else if (sieve[cnt] == 0)
            {
                 ans[++k] = p -> info;
                 DeleteInside(r); /// sterge de la p
            }
            else r = p;
            cnt++;
        }
    }
    for (int i = 1; i <= k; i++)
        fout << ans[i] << " ";
    fout << "\n";
}


int main()
{
    Solve();
    return 0;
}