#include <bits/stdc++.h>
using namespace std;
const long long BASE = 1e15;
struct str {
  long long a, b;
  str() : a(0), b(0) {}
  void increase(long long x) {
    b += x;
    a += b / BASE;
    b = b % BASE;
  }
  long long modulo(long long m) { return ((a % m) * (BASE % m) + b % m) % m; }
};
void chkmin(long long &a, long long b) { a = min(a, b); }
struct min_stuff {
  map<long long, long long> values;
  long long sum;
  void insert(long long x) {
    values[x]++;
    sum += x;
  }
  void erase(long long x) {
    values[x]--;
    sum -= x;
  }
  void min(long long x) {
    if (values.empty()) {
      return;
    }
    while (true) {
      auto pp = (*prev(values.end()));
      if (pp.first <= x) {
        break;
      }
      sum -= (pp.first - x) * pp.second;
      values.erase(pp.first);
      values[x] += pp.second;
    }
  }
  long long get_sum() { return sum; }
};
struct rmq {
  long long n;
  vector<long long> t;
  void init(long long _n) {
    n = 1;
    while (n < _n) {
      n *= 2;
    }
    t.resize(2 * n);
  }
  void update(long long pos, long long val) {
    pos += n;
    t[pos] = val;
    pos >>= 1;
    while (pos) {
      t[pos] = min(t[pos * 2], t[pos * 2 + 1]);
      pos >>= 1;
    }
  }
  long long get(long long l, long long r) {
    l += n;
    r += n;
    long long res = 2e9;
    while (l <= r) {
      if (l & 1) {
        chkmin(res, t[l]);
        l++;
      }
      if ((r & 1) == 0) {
        chkmin(res, t[r]);
        r--;
      }
      l >>= 1;
      r >>= 1;
    }
    return res;
  }
};
struct solver {
  solver() {}
  vector<long long> s, p, alive, link;
  vector<long long> w;
  rmq R;
  min_stuff S;
  str ans;
  long long q, n = 0;
  void init(long long _q) {
    q = _q;
    s.resize(q);
    p.resize(q);
    w.resize(q);
    alive.resize(q);
    link.resize(q);
    R.init(q);
  }
  str query(long long c, long long new_w) {
    s[n] = c;
    w[n] = new_w;
    if (n == 0) {
      p[n] = -1;
    } else {
      p[n] = p[n - 1];
      while (p[n] != -1 && s[p[n] + 1] != s[n]) {
        p[n] = p[p[n]];
      }
      if (s[p[n] + 1] == s[n]) {
        p[n]++;
      }
      alive[n - 1] = s[n];
      if (p[n - 1] == -1 || alive[p[n - 1]] != alive[n - 1]) {
        link[n - 1] = p[n - 1];
      } else {
        link[n - 1] = link[p[n - 1]];
      }
    }
    R.update(n, w[n]);
    long long v = n - 1;
    while (v != -1) {
      if (alive[v] != s[n]) {
        S.erase(R.get(n - 1 - v, n - 1));
        v = p[v];
      } else {
        v = link[v];
      }
    }
    S.min(w[n]);
    if (s[n] == s[0]) {
      S.insert(w[n]);
    }
    n++;
    ans.increase(S.get_sum());
    return ans;
  }
};
solver S;
const long long MAXK = 26;
const long long MAX_C = (1 << 30);
void query(char &c, long long &w, str ans) {
  c = 'a' + ((c - 'a') + ans.modulo(MAXK)) % MAXK;
  w = w ^ (ans.modulo(MAX_C));
}
signed main() {
  long long q;
  cin >> q;
  S.init(q);
  str ans;
  while (q--) {
    char c;
    long long w;
    cin >> c >> w;
    query(c, w, ans);
    long long _c = c - 'a';
    ans = S.query(_c, w);
    if (ans.a != 0) {
      cout << ans.a;
      long long t = ans.b;
      long long len = 0;
      while (t > 0) {
        len++;
        t /= 10;
      }
      while (len < 15) {
        cout << 0;
        len++;
      }
    }
    cout << ans.b << "\n";
  }
  return 0;
}
