# PBinfo #2414 – 2lap – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Se citesc două numere naturale N și M și apoi, de pe următoarea linie, numere naturale de forma 2p, separate prin câte un spațiu. Să se afișeze:
1. care sunt valorile ce ar apărea pe pozițiile N și M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului, separate printr-un spațiu;
2. puterea la care apare 2 în descompunerea în factori primi a produsului tuturor numerelor care ar fi situate între pozițiile  N și M  (exclusiv acestea) în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare;
3. toate numerele distincte, afișate în ordine crescătoare, care ar apărea între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător, obținut din valorile citite de pe a doua linie a fișierului de intrare.

Date de intrare
Fișierul de intrare 2lap.in conține pe prima linie numărul N și M despărțite printr-un spațiu, iar pe a doua linie numere naturale de forma 2p, separate de asemenea prin spații.

Date de ieșire
Fișierul de ieșire 2lap.out va conține pe prima linie numerele K1 și K2 reprezentând numerele care ar apărea pe pozițiile N, respectiv M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare, separate printr-un spațiu, pe a doua linie a fișierului un singur număr K reprezentând puterea la care apare 2 în descompunerea în factori primi a produsului cerut, iar pe a treia linie a fișierului de ieșire, valorile cerute, de asemenea separate printr-un spațiu.

Restricții și precizări

1 ≤ N < M ≤ 30000
0 ≤ p ≤ 30
șirul nu are mai puțin de M termeni
N + 1 < M

Exemplu:
2lap.in

5 8
16 32 2 64 256 128 32 128 32 128 
2lap.out

32 128
13
64 128
Explicație
Șirul ordonat ar fi: 2 16 32 32 32 64 128 128 128 256, deci pe poziția a 5-a s-ar afla valoarea 32 iar pe poziția 8, 128. Între acestea se află valorile 64 și 128, produsul lor este 8192 a cărui descompunere în factori primi este 213.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
int ap[31], i, j, n, k, x, a, b, m, S, nra, nrb;
ifstream f("2lap.in");
ofstream g("2lap.out");
int main()
{
    f >> n >> m;
    while (f >> x)
    {
        k = 0;
        while (x != 1)
        {
            k++;
            x /= 2;
        }
        ap[k]++; //pastrez intr-un vector de aparitii câte numere apar la puterea k, a lui 2
    }
    k=0;
    for (i = 0; i <= 30; i++)
    {
        x = ap[i];
        while(x)
        {
            x--;
            k++;
            if (n == k)
            {
                a = i;
                nra = x; //câte valori egale cu elementul de pe poziția N sunt între pozițíile N și M
            }
            if (m == k)
            {
                b = i;
                nrb = ap[i]-x-1;//câte valori egale cu elementul de pe poziția M sunt între pozițíile N și M
            }
        }
    }
    g << (1 << a) << ' ' << (1 << b) << '\n';
    S = nra*a  + nrb*b;
    //g << nra << ' ' << nrb << '\n';
    for (i = a + 1; i <= b - 1; i++)
        if (ap[i]) S += ap[i]*i;
    if (a==b) S = (m - n - 1)*a;
    g << S << '\n';
    if (nra==0) a++;
    if (nrb==0) b--;
    for (i = a; i <= b; i++)
        if (ap[i] != 0) g << (1 << i) << ' ';//pentru reconstrucția numărului de pe poziția i, folosesc operatorul de deplasare stânga
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2414)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2414/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2414/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
