Debugowanie programu OI - błąd stack smashing przy push_backowaniu do vectora

0

Witam,
mam problem z usunięciem problemu w rozwiązaniu zadania "Morskie opowieści" z XX Olimpiady Informatycznej (zadanie dostępne pod adresem https://szkopul.edu.pl/problemset/problem/CfSEK4ACOcAPaAfX29Fp7Tud/site/?key=statement).
Po raz pierwszy natknąłem się na błąd pt. "stack smashing detected", znalazłem co dokładnie go powoduje, jednak nie mogę zrozumieć przyczyny.
Kod wygląda tak:

#include <bits/stdc++.h>

using namespace std;

const int N = 5e3 + 7;
const int INFTY = 2147483646;

struct wierzcholek
{
	int koszt_do_wyszukiwanego;
	int id;
};

wierzcholek tab[10*N];
class kolejka
{
	int i, j;
	
	public:
	kolejka()
	{
		i = 0;
		j = 0;
	}
	bool empty()
	{
		return (j-i) == 0;
	}
	void push(wierzcholek input)
	{
		tab[j++] = input;
	}
	wierzcholek front()
	{
		return tab[i];
	}
	void pop()
	{
		++i;
	}
	
};

vector<int> polaczenia[2*N];
int min_koszt[N][2*N];
int n, m, k;


int main()
{
	//wejscie i przygotowanie tablic:
	scanf("%d %d %d", &n, &m, &k);
	for (int i = 0; i < m; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		polaczenia[a].push_back(b+n);
		polaczenia[b+n].push_back(a);
		polaczenia[a+n].push_back(b);
		polaczenia[b].push_back(a+n);
	}
	
	for (int i = 0; i < N; i++)
		for (int j = 0; j < 2*N; j++)
			min_koszt[i][j] = INFTY;
	//---------------------
	
	
	//obliczanie min_kosztow parzystych i nieparzystych:
	for (int i = 1; i <= n; i++)
	{
		//uzupelniamy min_koszt[i] algorytmem BFS
		kolejka kolejne_wierzcholki;
		bitset<N> odwiedzony; odwiedzony.reset();
		
		kolejne_wierzcholki.push(wierzcholek{0, i});
		while(!kolejne_wierzcholki.empty())
		{
			wierzcholek aktualny = kolejne_wierzcholki.front(); kolejne_wierzcholki.pop();
			if (odwiedzony[aktualny.id] == false)
			{
				odwiedzony[aktualny.id] = true;
				min_koszt[i][aktualny.id] = aktualny.koszt_do_wyszukiwanego;
				for (size_t j = 0; j < polaczenia[aktualny.id].size(); j++)
				{
					int syn_id = polaczenia[aktualny.id][j];
					kolejne_wierzcholki.push(wierzcholek{aktualny.koszt_do_wyszukiwanego+1, syn_id});
				}
			}
		}
	}
	//---------------------
	
	
	//obsluga zapytan:
	for (int i = 0; i < k; i++)
	{
		int port_startowy, port_koncowy, d;
		scanf("%d %d %d", &port_startowy, &port_koncowy, &d);
		
		int min_parzysty = min_koszt[port_koncowy][port_startowy];
		int min_nieparzysty = min_koszt[port_koncowy][port_startowy+n];
		
		if(d%2 == 0)
		{
			if(d >= min_parzysty)
				printf("TAK");
			else
				printf("NIE");
		}
		else
		{
			if(d >= min_nieparzysty)
				printf("TAK");
			else
				printf("NIE");
		}
		printf("\n");
	}
	//---------------------

	
	
	return 0;
}

Problem wywołują linie:
57: polaczenia[a].push_back(b+n);
60: polaczenia[b].push_back(a+n);
a dokładniej dodanie +n. Nie mam jednak zielonego pojęcia dlaczego... Program wykonuje się poprawnie, zwraca wszystkie wyniki i jest ubijany przez system z w/w błędem. Ma ktoś pomysł co nie gra albo jak to można zdebugować?

W załączniku do pobrania przykładowy test który ubija program: wejscie.txt
Zakresy zmiennych na wejściu:

zmienna wartości
n 2 <= n <= 5000
m 1 <= m <= 5000
k 1 <= k <= 1000000
a 1 <= a <= n
b 1 <= b <= n
2

wykraczasz poza zakres tablicy polaczenia.
Jej rozmiar ustawiłeś na 507 * 2.
Pierwsza linijka danych wejściowych to 2710 4599 8, druga (która ma wpływ na błąd) 2317 488 co daje indeksy wykraczające poza 1014.

0
MarekR22 napisał(a):

Jej rozmiar ustawiłeś na 507 * 2.

O cholercia, jak jest człowiek zmęczony to i notację wykładniczą pomyli... Dzięki wielkie!

0

Matko, po poprawieniu na

const int N = 5007;

(tak jak miało być od początku) nadal występuje taki sam błąd...

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