#include <bits/stdc++.h>
using namespace std;
std::mt19937 rng(
    (int)std::chrono::steady_clock::now().time_since_epoch().count());
inline long long mod(long long n, long long m) {
  long long ret = n % m;
  if (ret < 0) ret += m;
  return ret;
}
long long gcd(long long a, long long b) {
  return (b == 0LL ? a : gcd(b, a % b));
}
long long exp(long long b, long long e, long long m) {
  b %= m;
  long long ans = 1;
  for (; e; b = b * b % m, e /= 2)
    if (e & 1) ans = ans * b % m;
  return mod(ans, m);
}
struct NO {
  long long x;
  NO() {}
  NO(long long w) { x = w; }
  NO operator+(const NO& rhs) const {
    NO r;
    r.x = min(x, rhs.x);
    return r;
  }
};
template <class T>
struct ST {
  vector<T> st;
  int n;
  T ini;
  ST() {}
  ST(int n, T ini) : st(2 * n, ini), n(n), ini(ini) {}
  void upd(int pos, T val) {
    for (st[pos += n] = val; pos /= 2;) st[pos] = st[2 * pos] + st[2 * pos + 1];
  }
  T query(int x, int y) {
    T ra = ini, rb = ini;
    for (x += n, y += n + 1; x < y; x /= 2, y /= 2) {
      if (x & 1) ra = ra + st[x], x++;
      if (y & 1) --y, rb = st[y] + rb;
    }
    return ra + rb;
  }
};
ST<NO> tree;
set<int> pos;
unsigned long long tot;
map<unsigned long long, int> Cnt;
int n;
void add(long long w) {
  while (!Cnt.empty()) {
    auto it = *Cnt.rbegin();
    if (it.first <= w) break;
    int cnt = it.second;
    tot -= cnt * (it.first - w);
    Cnt.erase(it.first);
    Cnt[w] += cnt;
  }
}
const int N = 600100;
char s[N];
long long w[N];
int pi[N];
char nxt[N];
int link[N];
void print(__int128 t) {
  vector<int> vec;
  while (t > 0) {
    vec.push_back(t % 10);
    t /= 10;
  }
  if (((int)vec.size()) == 0) vec.push_back(0);
  reverse(vec.begin(), vec.end());
  for (int i : vec) cout << i;
  cout << "\n";
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n;
  tree = ST<NO>(n, {(1LL << 60) - 1});
  const long long MASK = (1LL << 30) - 1;
  __int128 ans = 0;
  unsigned long long help1 = 0, help2 = 0;
  for (int i = 0; i < n; i++) {
    cin >> s[i] >> w[i];
    int SLA = (int)(s[i] - 'a');
    SLA = (int)(SLA + help1) % 26;
    s[i] = char(SLA + 'a');
    w[i] = (w[i] ^ (help2));
    tree.upd(i, {w[i]});
    if (i == 0) {
      pi[i] = -1;
    } else {
      pi[i] = pi[i - 1];
      nxt[i - 1] = s[i];
      while (pi[i] != -1 and s[i] != s[pi[i] + 1]) pi[i] = pi[pi[i]];
      if (s[pi[i] + 1] == s[i]) pi[i]++;
      if (pi[i - 1] == -1 || nxt[pi[i - 1]] != s[i]) {
        link[i - 1] = pi[i - 1];
      } else {
        link[i - 1] = link[pi[i - 1]];
      }
    }
    int cur = i - 1;
    while (cur != -1) {
      if (nxt[cur] != s[i]) {
        int cost = tree.query(i - 1 - cur, i - 1).x;
        tot -= cost;
        if (--Cnt[cost] == 0) Cnt.erase(cost);
        cur = pi[cur];
      } else
        cur = link[cur];
    }
    if (s[0] == s[i]) {
      Cnt[w[i]]++;
      tot += w[i];
      pos.insert(i);
    }
    add(w[i]);
    ans = (ans + tot);
    help1 = (help1 + tot) % 26;
    help2 = ((help2 + tot) & MASK);
    print(ans);
  }
}
