1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
#include <bits/stdc++.h> #define FOR(i, a, b) for (int i = (a); i <= (b); ++i) #define ROF(i, a, b) for (int i = (a); i >= (b); --i) #define all(x) x.begin(),x.end() #define CLR(i,a) memset(i,a,sizeof(i)) #define fi first #define se second #define pb push_back #define SZ(a) ((int) a.size())
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef __int128 i128; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; typedef pair<DB,DB> pdd; typedef pair<ll,bool> plb; constexpr ll MAXN=static_cast<ll>(1e6)+10,INF=static_cast<ll>(5e18)+3;
ll N,Q,T,A[MAXN];
inline ll binpow(ll x,ll k){ ll res=1; while(k){ if(k&1) res*=x; x*=x; k>>=1; } return res; }
inline bool isIn(ll x,ll y,ll x1,ll y1,ll x2,ll y2){ if(x<x1 || x>x2) return false; if(y<y1 || y>y2) return false; return true; }
ll findNum(ll x,ll y,ll x1,ll y1,ll x2,ll y2,ll l,ll r){ if(l==r) return l; ll midx=x1+x2>>1,midy=y1+y2>>1; ll divPt1=l+(r-l)/4+1,divPt2=l+(r-l)/2+1,divPt3=l+3*(r-l)/4+1; if(isIn(x,y,x1,y1,midx,midy)){ return findNum(x,y,x1,y1,midx,midy,l,divPt1-1); }else if(isIn(x,y,midx+1,midy+1,x2,y2)){ return findNum(x,y,midx+1,midy+1,x2,y2,divPt1,divPt2-1); }else if(isIn(x,y,midx+1,y1,x2,midy)){ return findNum(x,y,midx+1,y1,x2,midy,divPt2,divPt3-1); }else{ return findNum(x,y,x1,midy+1,midx,y2,divPt3,r); } }
pll findPos(ll num,ll x1,ll y1,ll x2,ll y2,ll l,ll r){ if(x1==x2 && y1==y2) return {x1,y1}; ll midx=x1+x2>>1,midy=y1+y2>>1; ll divPt1=l+(r-l)/4+1,divPt2=l+(r-l)/2+1,divPt3=l+3*(r-l)/4+1;
if(num>=l && num<divPt1){ return findPos(num,x1,y1,midx,midy,l,divPt1-1); }else if(num>=divPt1 && num<divPt2){ return findPos(num,midx+1,midy+1,x2,y2,divPt1,divPt2-1); }else if(num>=divPt2 && num<divPt3){ return findPos(num,midx+1,y1,x2,midy,divPt2,divPt3-1); }else{ return findPos(num,x1,midy+1,midx,y2,divPt3,r); } }
inline void solve(){ cin>>N>>Q; FOR(i,1,Q){ char op1,op2; cin>>op1>>op2; if(op2=='>'){ ll x,y; cin>>x>>y; cout<<findNum(x,y,1,1,binpow(2,N),binpow(2,N),1,binpow(2,2*N))<<"\n";
}else{ ll num; cin>>num; pll res=findPos(num,1,1,binpow(2,N),binpow(2,N),1,binpow(2,2*N)); cout<<res.fi<<" "<<res.se<<"\n"; } } }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>T; while(T--){ solve(); } return 0; }
|