#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <time.h>
#include <utility>
#include <cmath>
#include <set>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define ll long long int
#define ipair pair<ll, ll>
#define mod 1000000007
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define rep(i,n) for(i=0;i<n;i++)
#define fu(i,a,n) for(i=a;i<=n;i++)
#define fd(i,n,a) for(i=n;i>=a;i--)
#define gi(n) scanf("%d",&n)
#define gl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define pi(n) printf("%d",n)
#define pp printf(" ")
#define pn printf("\n")
#define MAX 500000
#define LN 60
ll ctr;
struct node2 {
ll cont;
ll val; // count
ll lc;
ll rc;
node2(ll con, ll c, ll l, ll r) {
cont = con;
val = c;
lc = l;
rc = r;
}
node2() {
cont = val = lc = rc = 0;
}
} seg[MAX * LN * 2];
void update(ll &node, ll start, ll end, ll id) {
if(!node) {
node = ++ctr;
}
if(start^end) {
ll mid = (start + end) >> 1;
if(id <= mid) {
update(seg[node].lc, start, mid, id);
}
else {
update(seg[node].rc, mid + 1, end, id);
}
ll p = seg[node].lc;
ll q = seg[node].rc;
seg[node].val = seg[p].val + seg[q].val;
if(seg[p].cont == mid + 1 - start) {
seg[node].cont = seg[p].cont + seg[q].cont;
}
else {
seg[node].cont = seg[p].cont;
}
}
else {
seg[node].val = 1;
seg[node].cont = 1;
}
}
ll query(ll node, ll start, ll end, ll r) {
if(!node) {
return min(end, r);
}
if(start == end) {
return 0;
}
ll mid = (start + end) >> 1;
ll rig = seg[node].rc;
ll en = min(end, r);
if(r <= mid || (en - mid <= seg[rig].cont)) {
return query(seg[node].lc, start, mid, r);
}
return query(seg[node].rc, mid + 1, end, r);
}
int main() {
int t;
gi(t);
while(t--) {
ll n, q;
gl(n);
gl(q);
ll root = 0;
ll s = 0;
while(q--) {
int ch;
gi(ch);
if(ch == 1) {
ll x;
gl(x);
x+=s;
update(root, 1, n, x);
}
else {
ll l, r;
gl(l);
gl(r);
l+=s;
r+=s;
ll ans = query(root, 1, n, r);
if(ans < l) {
ans = 0;
}
s = (s + ans)%n;
pl(ans);
pn;
}
}
ll i;
fu(i, 1, ctr) {
seg[i].lc = seg[i].rc = seg[i].val = seg[i].cont = 0;
}
ctr = 0;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAojZGVmaW5lIGxsIGxvbmcgbG9uZyBpbnQKI2RlZmluZSBpcGFpciBwYWlyPGxsLCBsbD4KI2RlZmluZSBtb2QgMTAwMDAwMDAwNwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGZmIGZpcnN0CiNkZWZpbmUgc3Mgc2Vjb25kCiNkZWZpbmUgcmVwKGksbikgZm9yKGk9MDtpPG47aSsrKQojZGVmaW5lIGZ1KGksYSxuKSBmb3IoaT1hO2k8PW47aSsrKQojZGVmaW5lIGZkKGksbixhKSBmb3IoaT1uO2k+PWE7aS0tKQojZGVmaW5lIGdpKG4pIHNjYW5mKCIlZCIsJm4pCiNkZWZpbmUgZ2wobikgc2NhbmYoIiVsbGQiLCZuKQojZGVmaW5lIHBsKG4pIHByaW50ZigiJWxsZCIsbikKI2RlZmluZSBwaShuKSBwcmludGYoIiVkIixuKQojZGVmaW5lIHBwIHByaW50ZigiICIpCiNkZWZpbmUgcG4gcHJpbnRmKCJcbiIpCiNkZWZpbmUgTUFYIDUwMDAwMAojZGVmaW5lIExOIDYwCgpsbCBjdHI7CnN0cnVjdCBub2RlMiB7CglsbCBjb250OwoJbGwgdmFsOwkvLyBjb3VudAoJbGwgbGM7CglsbCByYzsKCW5vZGUyKGxsIGNvbiwgbGwgYywgbGwgbCwgbGwgcikgewoJCWNvbnQgPSBjb247CgkJdmFsID0gYzsKCQlsYyA9IGw7CgkJcmMgPSByOwoJfQoJbm9kZTIoKSB7CgkJY29udCA9IHZhbCA9IGxjID0gcmMgPSAwOwoJfQp9IHNlZ1tNQVggKiBMTiAqIDJdOwoKCnZvaWQgdXBkYXRlKGxsICZub2RlLCBsbCBzdGFydCwgbGwgZW5kLCBsbCBpZCkgewoJaWYoIW5vZGUpIHsKCQlub2RlID0gKytjdHI7Cgl9CglpZihzdGFydF5lbmQpIHsKCQlsbCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7CgkJaWYoaWQgPD0gbWlkKSB7CgkJCXVwZGF0ZShzZWdbbm9kZV0ubGMsIHN0YXJ0LCBtaWQsIGlkKTsKCQl9CgkJZWxzZSB7CgkJCXVwZGF0ZShzZWdbbm9kZV0ucmMsIG1pZCArIDEsIGVuZCwgaWQpOwoJCX0KCQlsbCBwID0gc2VnW25vZGVdLmxjOwoJCWxsIHEgPSBzZWdbbm9kZV0ucmM7CgkJc2VnW25vZGVdLnZhbCA9IHNlZ1twXS52YWwgKyBzZWdbcV0udmFsOwoJCWlmKHNlZ1twXS5jb250ID09IG1pZCArIDEgLSBzdGFydCkgewoJCQlzZWdbbm9kZV0uY29udCA9IHNlZ1twXS5jb250ICsgc2VnW3FdLmNvbnQ7CgkJfQoJCWVsc2UgewoJCQlzZWdbbm9kZV0uY29udCA9IHNlZ1twXS5jb250OwoJCX0KCX0KCWVsc2UgewoJCXNlZ1tub2RlXS52YWwgPSAxOwoJCXNlZ1tub2RlXS5jb250ID0gMTsKCX0KfQogCmxsIHF1ZXJ5KGxsIG5vZGUsIGxsIHN0YXJ0LCBsbCBlbmQsIGxsIHIpIHsKCWlmKCFub2RlKSB7CgkJcmV0dXJuIG1pbihlbmQsIHIpOwoJfQoJaWYoc3RhcnQgPT0gZW5kKSB7CgkJcmV0dXJuIDA7Cgl9CglsbCBtaWQgPSAoc3RhcnQgKyBlbmQpID4+IDE7CglsbCByaWcgPSBzZWdbbm9kZV0ucmM7CglsbCBlbiA9IG1pbihlbmQsIHIpOwoJaWYociA8PSBtaWQgfHwgKGVuIC0gbWlkIDw9IHNlZ1tyaWddLmNvbnQpKSB7CgkJcmV0dXJuIHF1ZXJ5KHNlZ1tub2RlXS5sYywgc3RhcnQsIG1pZCwgcik7Cgl9CglyZXR1cm4gcXVlcnkoc2VnW25vZGVdLnJjLCBtaWQgKyAxLCBlbmQsIHIpOwp9CiAKaW50IG1haW4oKSB7CglpbnQgdDsKCWdpKHQpOwoJd2hpbGUodC0tKSB7CgkJbGwgbiwgcTsKCQlnbChuKTsKCQlnbChxKTsKCQlsbCByb290ID0gMDsKCQlsbCBzID0gMDsKCQl3aGlsZShxLS0pIHsKCQkJaW50IGNoOwoJCQlnaShjaCk7CgkJCWlmKGNoID09IDEpIHsKCQkJCWxsIHg7CgkJCQlnbCh4KTsKCQkJCXgrPXM7CgkJCQl1cGRhdGUocm9vdCwgMSwgbiwgeCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlsbCBsLCByOwoJCQkJZ2wobCk7CgkJCQlnbChyKTsKCQkJCWwrPXM7CgkJCQlyKz1zOwoJCQkJbGwgYW5zID0gcXVlcnkocm9vdCwgMSwgbiwgcik7CgkJCQlpZihhbnMgPCBsKSB7CgkJCQkJYW5zID0gMDsKCQkJCX0KCQkJCXMgPSAocyArIGFucyklbjsKCQkJCXBsKGFucyk7CgkJCQlwbjsKCQkJfQoJCX0KCQlsbCBpOwoJCWZ1KGksIDEsIGN0cikgewoJCQlzZWdbaV0ubGMgPSBzZWdbaV0ucmMgPSBzZWdbaV0udmFsID0gc2VnW2ldLmNvbnQgPSAwOwoJCX0KCQljdHIgPSAwOwoJfQoKCXJldHVybiAwOwp9