N, Q =map(int,input().split())
S =['#']+[i for i ininput()]
D =[0]*(N +2)for _ inrange(Q):
l, r, k =map(int,input().split())
k %=26; D[l]+= k; D[r +1]-= k
for i inrange(1, N +1):
D[i]=(D[i]+ D[i -1])%26iford(S[i])+ D[i]<=ord('z'):print(chr(ord(S[i])+ D[i]), end="")else:print(chr(ord(S[i])+ D[i]-26), end="")
N =int(input())
A =list(map(int,input().split()))
cnts =[0]*31# cnt[i]表示A数组二进制第i位1的个数总和for num in A:
idx =1while num >0:if num &1:# 当前位是1
cnts[idx]+=1
idx +=1
num >>=1
ans =0for cnt in cnts:if cnt !=0:
ans +=(cnt-1)* cnt //2print(ans)
T =int(input())for _ inrange(T):
n, m =map(int,input().split())# 1.找第 n 位所处的位数 k:代表位数
k =1; idx = m -1# idx 记录 k 为最大位数while n > idx:# 需要增加一位
k +=1
idx += k *(m -1)*pow(m, k -1)
n = n - idx + k *(m -1)*pow(m, k -1)
cnt =(n -1)// k # 长度为 k 的第 cnt 个数字# 2.构造长度为 k 的第 cnt 位数字
lst =[1]+[0]*(k -1)for i inrange(k -1,-1,-1):
lst[i]+= cnt % m
cnt //= m
print(lst[n % k -1])
from queue import PriorityQueue
n =int(input()); Q = PriorityQueue()for num inmap(int,input().split()):
Q.put(num)
ans =1while n >=2:
x = Q.get(); y = Q.get()if x != y:
ans =2;break
Q.put(x +1); n -=1print(ans)
N =int(input())
A =list(map(int,input().split()))
cnts =[0]*31# cnt[i]表示A数组二进制第i位1的个数总和for num in A:
idx =1while num >0:if num &1:# 当前位是1
cnts[idx]+=1
idx +=1
num >>=1
ans =0for cnt in cnts:if cnt !=0:
ans +=(cnt-1)* cnt //2print(ans)
T =int(input())for _ inrange(T):
n, m =map(int,input().split())# 1.找第 n 位所处的位数 k:代表位数
k =1; idx = m -1# idx 记录 k 为最大位数while n > idx:# 需要增加一位
k +=1
idx += k *(m -1)*pow(m, k -1)
n = n - idx + k *(m -1)*pow(m, k -1)
cnt =(n -1)// k # 长度为 k 的第 cnt 个数字# 2.构造长度为 k 的第 cnt 位数字
lst =[1]+[0]*(k -1)for i inrange(k -1,-1,-1):
lst[i]+= cnt % m
cnt //= m
print(lst[n % k -1])
from queue import PriorityQueue
n =int(input()); Q = PriorityQueue()for num inmap(int,input().split()):
Q.put(num)
ans =1while n >=2:
x = Q.get(); y = Q.get()if x != y:
ans =2;break
Q.put(x +1); n -=1print(ans)