Problem p01620 (C++) — buggy submission, verdict: Runtime Error

#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <utility>
#include <vector>
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define repp(i, k, n) for (int i = k; i < (int)n; i++)
using namespace std;
const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
const int dX[8] = {0, 1, 1, 1, 0, -1, -1, -1},
          dY[8] = {1, 1, 0, -1, -1, -1, 0, 1};
struct XY {
  int x;
  int y;
};
vector<long long> Prime;
void SieveOfEratosthenes(long long e) // setup vector<long long>Prime(~x)
{
  bool *x = new bool[e];
  for (long long i = 0; i <= e; i++)
    x[i] = false;
  for (long long i = 2; i <= e; i++) {
    if (x[i])
      ;
    else {
      Prime.push_back(i);
      for (long long l = i; l <= e; l += i)
        x[l] = true;
    }
  }
  return;
}
int StringToInt(string a) {
  stringstream ss;
  int x;
  ss << a;
  ss >> x;
  return x;
}
string IntToString(int a) {
  stringstream ss;
  string x;
  ss << a;
  ss >> x;
  return x;
}
int GetRandom(int MIN, int MAX) {
  static int flag = 0;
  if (flag == 0) {
    srand((unsigned int)time(NULL));
    flag = 1;
  }
  return MIN + (int)(rand() * (MAX - MIN + 1.0) / (1.0 + RAND_MAX));
}
int in() {
  int x;
  cin >> x;
  return x;
}
void outl(string a) {
  cout << a << endl;
  return;
}
void outl(int a) {
  cout << a << endl;
  return;
}
void out(string a) {
  cout << a;
  return;
}
void out(int a) {
  cout << a;
  return;
}
/*
(char)'1' - (int)48 = (int)1;
???1111181
 (char)A=(int)65
 (char)a=(int)97
*/
////////////////////////////////////////////////////
vector<char> al;

int main() {

  rep(i, 26) { al.push_back(i + 97); }
  rep(i, 26) { al.push_back(i + 65); }
  while (al.size() < 1000)
    rep(i, 52) al.push_back(al[i]);
  int n;
  while (cin >> n && n) {
    int r, l;
    vector<int> a;
    string b;
    rep(i, n) a.push_back(in());
    while (a.size() < 150)
      rep(i, n) a.push_back(a[i]);
    cin >> b;
    b += "a";

    for (int i = 0; i < b.size() - 1; i++) {
      for (r = 0;; r++)
        if (al[r] == b[i])
          break;
      cout << al[r - a[i] + 312];
    }

    cout << endl;
  }
}

Error: WA

Fixed submission:

#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <utility>
#include <vector>
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define repp(i, k, n) for (int i = k; i < (int)n; i++)
using namespace std;
const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
const int dX[8] = {0, 1, 1, 1, 0, -1, -1, -1},
          dY[8] = {1, 1, 0, -1, -1, -1, 0, 1};
struct XY {
  int x;
  int y;
};
vector<long long> Prime;
void SieveOfEratosthenes(long long e) // setup vector<long long>Prime(~x)
{
  bool *x = new bool[e];
  for (long long i = 0; i <= e; i++)
    x[i] = false;
  for (long long i = 2; i <= e; i++) {
    if (x[i])
      ;
    else {
      Prime.push_back(i);
      for (long long l = i; l <= e; l += i)
        x[l] = true;
    }
  }
  return;
}
int StringToInt(string a) {
  stringstream ss;
  int x;
  ss << a;
  ss >> x;
  return x;
}
string IntToString(int a) {
  stringstream ss;
  string x;
  ss << a;
  ss >> x;
  return x;
}
int GetRandom(int MIN, int MAX) {
  static int flag = 0;
  if (flag == 0) {
    srand((unsigned int)time(NULL));
    flag = 1;
  }
  return MIN + (int)(rand() * (MAX - MIN + 1.0) / (1.0 + RAND_MAX));
}
int in() {
  int x;
  cin >> x;
  return x;
}
void outl(string a) {
  cout << a << endl;
  return;
}
void outl(int a) {
  cout << a << endl;
  return;
}
void out(string a) {
  cout << a;
  return;
}
void out(int a) {
  cout << a;
  return;
}
/*
(char)'1' - (int)48 = (int)1;
???1111181
 (char)A=(int)65
 (char)a=(int)97
*/
////////////////////////////////////////////////////
vector<char> al;

int main() {

  rep(i, 26) { al.push_back(i + 97); }
  rep(i, 26) { al.push_back(i + 65); }
  rep(i, 51) al.push_back(al[i]);
  rep(i, 51) al.push_back(al[i]);
  rep(i, 51) al.push_back(al[i]);
  int n;
  while (cin >> n && n) {
    int r, l;
    vector<int> a;
    string b;
    rep(i, n) a.push_back(in());
    rep(i, n) a.push_back(a[i]);
    rep(i, n) a.push_back(a[i]);
    cin >> b;
    b += "a";

    for (int i = 0; i < b.size() - 1; i++) {
      for (r = 0;; r++)
        if (al[r] == b[i])
          break;
      cout << al[r - a[i] + 103];
    }

    cout << endl;
  }
}