为什么这段代码会超时(自己试了试不会啊)?

http://noi.openjudge.cn/ch0302/1748/

#include <stdlib.h>
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
void returnint(int,int);
int main() {
    int d1 = 1, d2 = 1, mn = 0,source[2][100],k=0;
    while (1)
    {
        cin >> source[0][k];
        cin >> source[1][k];
        if (source[0][k] == 0 || &source[1][k]==0)break;
        k++;
    }
    for (int t=0;t<k;t++)
    returnint(source[0][t], source[1][t]);
    //system("PAUSE");
        return 0;
}

void returnint(int d1, int d2)
{
    if (d1 == 0 || d2 == 0)
        return;
    int monkey[310] = { 0 },gap=0;
    for (int i = 0; i < d1; i++)
        monkey[i + 1] = 1;
    if (d1 < d2)
        d2 %= d1;
        //确定剩余的猴子→确定退出的猴子

        int i1 = 1, dnum = 0;//dnum:退出个数
        while (1)
        {

            if (monkey[i1] == 1)
            {
                gap++;
                if (gap == d2)
                {
                    monkey[i1] = 0;
                    dnum++;
                    gap = 0;
                }

            }
            if (dnum == (d1))
            {
                cout << i1 << endl;
                break;
            }
            i1++;
            if (i1 > d1)
                i1 %= d1;
        }

}

如果在本地可以,而oj这些上runtime error,这个并没有动态,就是访问出界了吧,数组开小了?oj上测试数据多……