Robiąc zadanie ze SPOJ'a: https://pl.spoj.pl/problems/POTEGA/ wyskakiwał mi ciągle błąd SIGARBT, natomiast na moim kompie też wyskakiwały mi pełno błędow podczas uruchamiania programu.

Oto kod:


#include <cstdio>
#include <vector>

const int max = 3001;

std::vector <int> l1(max);
std::vector <int> l2;
std::vector <int> p(max);
std::vector <int> w(max);

int char2int(char znak);

//----------------------------------------------------------------------

int main()
{

	char znak;
	
	while(1)
	{
		scanf("%c", &znak);
		if(znak == ' ')
			break;
		l2.push_back( char2int(znak) );
	}
		
	l1[max - 1] = 1;
	
	int n;
	scanf("%d", &n);
	
	while(n--)
	{	
		for(int i = l2.size() - 1, n1 = 0; i >= 0; i--, n1++)
		{
		
			for(int j = max - 1, n2 = n1; j >= 0; j--, n2++)
			{
				p[n2] += l1[j] * l2[i];
			
				if(p[n2] > 9)
				{
					p[n2 + 1] = p[n2] / 10;
					p[n2] %= 10;
				}
			
			}
		
			for(int j = 0; j < max; j++)
			{
				w[j] += p[j];
			
				if(w[j] > 9)
				{
					w[j + 1] += w[j] / 10;
					w[j] %= 10;
				}
			
			}
		
			for(int i = 0; i < max; i++)
			{
				p[i] = 0;
			}
		
		}
	
		for(int i = 0, j = max - 1; i < max; i++, j--)
		{
			l1[j] = w[i];
		}
	
		for(int i = 0; i < max; i++)
		{
			w[i] = 0;
		}
	
	}
	
	for(int i = 0; i < max; i++)
	{
				
		if(l1[i] != 0)
		{
			
			for( ; i < max; i++)
			{
				printf("%d", l1[i]);
			} 
			
			printf("\n");
			
		}
		
		if(i == max - 1)
			printf("0\n");
	}
	
	return 0;
}

//----------------------------------------------------------------------

int char2int(char znak)
{
	return (int) (znak) - 48;
}

Błędy pojawiały się, gdy podstawa potęgi nie była cyfrą (tzn. liczbą jednocyfrową).
Gdy jednak zmieniłem ten fragment:

std::vector <int> l1(max);
std::vector <int> l2;
std::vector <int> p(max);
std::vector <int> w(max);

Na taki:

int l1[max];
std::vector <int> l2;
int p[max];
int w[max];

Wszystko działało ok i SPOJ zaakceptował.

Mógłby mi ktoś wytłumaczyć, co robiłem źle z tymi vectorami?

Z góry dzięki