for(auto &i:dx) { i.second.insert(0); i.second.insert(m+1); } for(auto &i:dy) { i.second.insert(0); i.second.insert(n+1); } int q; cin>>q; for(int i = 1;i<=q;i++) { char op; ll k; cin>>op>>k; if(op=='L') { ll nxt_y = y-k; if(dx.find(x)==dx.end())//如果在x这一行都没有障碍物那么就直接走,只要不越界 y = max(nxt_y,1ll); else { auto it = dx[x].lower_bound(y);//找到>=y的第一个 it = prev(it); //prev反向,那么找到<y的第一个(因为我们要向左走)那么*it是第一个不能到达的地方,最多能走到*it+1 y = max(*it+1,nxt_y); } } elseif(op=='R') { ll nxt_y = y+k; if(dx.find(x)==dx.end()) y = min(nxt_y,(ll)m); else {
auto it = dx[x].lower_bound(y); y = min(*it-1,nxt_y); } } elseif(op=='U') { ll nxt_x = x-k; if(dy.find(y)==dy.end()) x = max(nxt_x,1ll); else { auto it = dy[y].lower_bound(x); it = prev(it); x = max(*it+1,nxt_x); } } else { ll nxt_x = x+k; if(dy.find(y)==dy.end()) x = min(nxt_x,(ll)n); else { auto it = dy[y].lower_bound(x); x = min(*it-1,nxt_x); } } cout<<x<<" "<<y<<endl; } return0; }