import std; void main () { int N, Q; readln.read(N, Q); string S = readln.chomp; auto H = new int[](Q); auto W = new int[](Q); auto P = new int[](Q); foreach (i; 0 .. Q) { readln.read(H[i], W[i], P[i]); } auto p = new int[][](30, N); auto dp = new Tuple!(long, long)[][](30, N); foreach (bit; 0 .. 30) { foreach (i; 0 .. N) { if (bit == 0) { dp[bit][i] = (S[i] == 'D' ? tuple(1L, 0L) : tuple(0L, 1L)); p[bit][i] = (i + 1) % N; } else { p[bit][i] = p[bit - 1][p[bit - 1][i]]; auto pr = dp[bit - 1][i]; auto su = dp[bit - 1][p[bit - 1][i]]; pr[0] += su[0]; pr[1] += su[1]; dp[bit][i] = pr; } } } auto ans = new int[](Q); foreach (i; 0 .. Q) { int cur = P[i]; auto val = tuple(0L, 0L); foreach_reverse (bit; 0 .. 30) { if (val[0] + dp[bit][cur][0] < H[i] && val[1] + dp[bit][cur][1] < W[i]) { val[0] += dp[bit][cur][0]; val[1] += dp[bit][cur][1]; cur = p[bit][cur]; } } ans[i] = (cur + 1) % N; } writefln("%(%s\n%)", ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }