Błąd w prostym zadaniu algorytmicznym nie mogę znaleźć

0

Zadanie

Dany jest ciąg liczb całkowitych a1, a2, . . . , an. Napisz program, który sprawdzi, czy w tym ciągu znajdują się dwie liczby różniące się dokładnie o d.

Wejście

W pierwszym wierszu standardowego wejścia znajdują się dwie liczby całkowite n oraz d (1 ≤ n ≤ 300 000, −10^9 ≤ d ≤ 10^9), oddzielone pojedynczym odstępem. Drugi wiersz zawiera n liczb całkowitych a1, a2, . . . , an (−10^9 ≤ ai ≤ 10^9), pooddzielanych pojedynczymi odstępami.

Wyjście

Jeśli w ciągu a nie ma żadnej pary elementów różniących się o d, Twój program powinien wypisać na standardowe wyjście jedno słowo NIE. W przeciwnym przypadku Twój program powinien wypisać dwie liczby całkowite u, v oddzielone pojedynczym odstępem, reprezentujące dwa wyrazy ciągu a różniące się o d (u = ai, v = aj, i ≠ j, u−v = d). Jeżeli istnieje więcej niż jedna poprawna odpowiedź, Twój program może wypisać dowolną z nich.

Przykład

Dla danych wejściowych:

5 3
5 3 4 -2 2

poprawnym wynikiem jest:

5 2

natomiast dla danych:

5 -3
5 3 4 -2 2

poprawnym wynikiem jest:

2 5

natomiast dla danych:

4 1
2 2 2 2

poprawnym wynikiem jest:

NIE

Moje niedziałające rozwiązanie:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
     
    int main() {
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
     
        int n; long long d; cin >> n >> d; vector<long long> tab(n);
        for(int i = 0; i < n; i++) {
        	long long a; cin >> a; tab[i] = a;
        }
        sort(tab.begin(), tab.end());
        int i = 0, j = 0;
        while(i+j < n) {
        	if(abs(tab[i] - tab[i+j]) == abs(d)) {
        		if(tab[i] - tab[i+j] == d) {
        			cout << tab[i] << ' ' << tab[i+j] << '\n';
        		} else if(tab[i+j] - tab[i] == d) {
        			cout << tab[i+j] << ' ' << tab[i] << '\n';
        		} else {
        			volatile unsigned int i = 0;
        			for(;;i++) cout << "DAFAQ\n";
        		}
        		return 0;
        	} else if(abs(tab[i] - tab[i+j]) < abs(d)) {
        		j++;
        	} else {
        		i++;
        	}
        }
        cout << "NIE\n";
    	return 0;
    }

Wypluwa sprawdzarka

    1 Zla roznica elementow
    2 Zla roznica elementow
    3 Oczekiwano: NIE
    4 Nie znaleziono wskazanych elementow
    9 Zla roznica elementow
    14 Zla roznica elementow
    15 Zla roznica elementow

WTF co jest kuźwa

ja nie twierdzę że nigdzie nie zrobiłem błędu ale żeby mój program wypluwał liczby o złej różnicy elementów?! Albo liczby których nie ma w ciągu?!

Już sprawdzałem na ile mogę żeby na pewno znalezione i wyplute liczby były zgodne z warunkami zadania! Nawet wywalam celowo program, jeśli by nie były!

        	if(abs(tab[i] - tab[i+j]) == abs(d)) {
        		if(tab[i] - tab[i+j] == d) {
        			cout << tab[i] << ' ' << tab[i+j] << '\n';
        		} else if(tab[i+j] - tab[i] == d) {
        			cout << tab[i+j] << ' ' << tab[i] << '\n';
        		} else {
        			volatile unsigned int i = 0;
        			for(;;i++) cout << "DAFAQ\n";
        		}
        		return 0;
        	}

Wydaje mi się, że nawet jeśłi mój program by miał nie znaleźć jakiegoś rozwiązania (chociaż nie widzę, czemu), to te powyższe linijki kodu naprawdę gwarantują, że każde znalezione rozwiązanie musi być prawidłowe?

Aha i jeszcze gdyby ktoś twierdził że to: cout << "DAFAQ\n"; może być przyczyną: nie, nie jest: sprawdzarka wyrzuca dokładnie te same błędy gdy wyrzucić cout i zostawić tylko nieskończoną pętlę lub nawet gdy wyrzucić całą nieskończoną pętlę.

Co jest?

0

Jakie jest pytanie?

0

Jakto jakie, gdzie mam błąd, czemu sprawdzarka wypluwa, że jest źle, czego nie widzę, jak naprawić mój program...

0

Dla danych

5 0
3 5 3 1 2

masz

1 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1