对于i节点,用l, r表示以该节点为根的子树所有节点的数值的范围,同时l,r也可以表示i节点,对于左孩子,用l, (l+r)/2-1表示,对于右孩子,用(l+r)/2+1, r表示
#include <bits/stdc++.h>
#define maxn 200005
typedef long long ll;
using namespace std;
struct Node{
ll l, r;
}node[maxn];
char str[maxn];
int main() {
// freopen("in.txt", "r", stdin);
ll n, q, m;
scanf("%I64d%I64d", &n, &q);
while(q--) {
scanf("%I64d%s", &m, str);
int cnt = 0;
node[cnt].l = 1;
node[cnt].r = n;
ll f;
while((f = (node[cnt].l + node[cnt].r) / 2) != m) {
cnt++;
if(m < f){
node[cnt].l = node[cnt-1].l;
node[cnt].r = f - 1;
}
else {
node[cnt].l = f + 1;
node[cnt].r = node[cnt-1].r;
}
}
for(int i = 0; str[i]; i++) {
if(str[i] == 'L') {
if(node[cnt].l == node[cnt].r)
continue;
else {
cnt++;
node[cnt].l = node[cnt-1].l;
node[cnt].r = (node[cnt-1].l + node[cnt-1].r) / 2 - 1;
}
}
if(str[i] == 'R') {
if(node[cnt].l == node[cnt].r)
continue;
else {
cnt++;
node[cnt].l = (node[cnt-1].l + node[cnt-1].r) / 2 + 1;
node[cnt].r = node[cnt-1].r;
}
}
if(str[i] == 'U') {
if(cnt == 0)
continue;
else {
cnt--;
}
}
}
printf("%I64d\n", (node[cnt].l + node[cnt].r) / 2);
}
return 0;
}