#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<int , int>
#define lll pair<long long , pair<long long , long long>>
#define lii pair<long long , pair<int , int>>
#define iii pair<int , pair<int , int>>
#define iiii pair<pair<int , int> , pair<int , int>>
#define llll pair<pair<__int128 , __int128> , pair<__int128 , __int128>>
#define li pair<long long , int>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))
const int INF = 1e7;
const long long MOD = 1e9 + 7;
const int N = 2e5 + 7;
int n , m , q;
long long t[8 * N];
int Cnt[2 * N];
bool col[2 * N];
struct gv{
long long x , y;
int id;
};
gv a[N];
struct Cand{
int type;
long long r1 , c1 , r2 , c2;
int id;
};
vector<Cand> cand;
void nen(){
vector<pair<long long , long long>> v2;
vector<long long> v1;
for (gv &C : a){
v1.push_back(C.x);
v2.push_back({C.x , C.y});
}
for (Cand &C : cand) if (C.type == 1){
v1.push_back(C.r1);
v2.push_back({C.r1 , C.c1});
}
sort(v1.begin() , v1.end());
sort(v2.begin() , v2.end());
v1.erase(unique(v1.begin() , v1.end()));
v2.erase(unique(v2.begin() , v2.end()));
for (gv &C : a){
int tmp = lower_bound(v2.begin() , v2.end() , (pair<long long , long long>){C.x , C.y}) - v2.begin();
C.x = lower_bound(v1.begin() , v1.end() , C.x) - v1.begin() + 1;
C.id = tmp;
}
for (Cand &C : cand){
if (C.type & 1){
int tmp = lower_bound(v2.begin() , v2.end() , (pair<long long , long long>){C.r1 , C.c1}) - v2.begin();
C.r1 = lower_bound(v1.begin() , v1.end() , C.r1) - v1.begin() + 1;
C.id = tmp;
}
else{
C.r1 = lower_bound(v1.begin() , v1.end() , C.r1) - v1.begin() + 1;
C.r2 = lower_bound(v1.begin() , v1.end() , C.r2) - v1.begin() + 1;
}
}
m = v1.size();
}
void inp(){
cin >> n >> q;
for (int i = 1 ; i <= n ; ++i){
cin >> a[i].x >> a[i].y;
}
for (int i = 1 ; i <= q ; ++i){
int type;
cin >> type;
if (type & 1){
long long r1 , c1;
cin >> r1 >> c1;
cand.push_back({type , r1 , c1 , 0 , 0 , 0});
}
else{
long long r1 , c1 , r2 , c2;
cin >> r1 >> c1 >> r2 >> c2;
cand.push_back({type , r1 , c1 , r2 , c2 , 0});
}
}
nen();
}
void update(int id , int l , int r , int pos , long long val){
if (l > pos || r < pos) return;
if (l == r){
t[id] = val;
t[id] %= MOD;
return;
}
int mid = (l + r) >> 1;
update(id << 1 , l , mid , pos , val);
update(id << 1 | 1 , mid + 1 , r , pos , val);
t[id] = t[id << 1] * t[id << 1 | 1];
t[id] %= MOD;
}
long long get(int id , int l , int r , int u , int v){
if (u > v) return 0;
if (u == v) return 1;
if (l > v || r < u) return 1;
if (u <= l && r <= v) return t[id];
int mid = (l + r) >> 1;
long long t1 = get(id << 1 , l , mid , u , v);
long long t2 = get(id << 1 | 1 , mid + 1 , r , u , v);
return t1 * t2 % MOD;
}
void solve(){
for (gv &C : a){
update(1 , 1 , m , C.x , 1);
col[C.id] = 1;
++Cnt[C.x];
}
for (Cand &C : cand){
if (C.type & 1){
if (col[C.id]){
col[C.id] = 0;
--Cnt[C.r1];
update(1 , 1 , m , C.r1 , Cnt[C.r1]);
}
else{
col[C.id] = 1;
++Cnt[C.r1];
update(1 , 1 , m , C.r1 , Cnt[C.r1]);
}
}
else{
cout << get(1 , 1 , m , C.r1 , C.r2) << '\n';
}
}
}
int main(){
// freopen("difmax.inp" , "r" , stdin);
// freopen("difmax.out" , "w" , stdout);
faster;
inp();
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZmFzdGVyIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpCiNkZWZpbmUgQml0KG1hc2sgLCBpKSAoKG1hc2sgPj4gaSkgJiAxKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgX0xPRzIobmwpIDMxIC0gX19idWlsdGluX2NseihubCkKI2RlZmluZSBjX2JpdChubCkgX19idWlsdGluX3BvcGNvdW50KG5sKQojZGVmaW5lIGlpIHBhaXI8aW50ICwgaW50PgojZGVmaW5lIGxsbCBwYWlyPGxvbmcgbG9uZyAsIHBhaXI8bG9uZyBsb25nICwgbG9uZyBsb25nPj4KI2RlZmluZSBsaWkgcGFpcjxsb25nIGxvbmcgLCBwYWlyPGludCAsIGludD4+CiNkZWZpbmUgaWlpIHBhaXI8aW50ICwgcGFpcjxpbnQgLCBpbnQ+PgojZGVmaW5lIGlpaWkgcGFpcjxwYWlyPGludCAsIGludD4gLCBwYWlyPGludCAsIGludD4+CiNkZWZpbmUgbGxsbCBwYWlyPHBhaXI8X19pbnQxMjggLCBfX2ludDEyOD4gLCBwYWlyPF9faW50MTI4ICwgX19pbnQxMjg+PgojZGVmaW5lIGxpIHBhaXI8bG9uZyBsb25nICwgaW50PgojZGVmaW5lIGRiIGxvbmcgZG91YmxlCiNkZWZpbmUgb25CaXQobWFzayAsIGkpIChtYXNrIHwgKDEgPDwgaSkpCiNkZWZpbmUgb2ZmQml0KG1hc2sgLCBpKSAobWFzayAmICh+KDEgPDwgaSkpKQoKY29uc3QgaW50IElORiA9IDFlNzsKY29uc3QgbG9uZyBsb25nIE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBOID0gMmU1ICsgNzsKaW50IG4gLCBtICwgcTsKbG9uZyBsb25nIHRbOCAqIE5dOwppbnQgQ250WzIgKiBOXTsKYm9vbCBjb2xbMiAqIE5dOwoKc3RydWN0IGd2ewogICAgbG9uZyBsb25nIHggLCB5OwogICAgaW50IGlkOwp9OwoKZ3YgYVtOXTsKCnN0cnVjdCBDYW5kewogICAgaW50IHR5cGU7CiAgICBsb25nIGxvbmcgcjEgLCBjMSAsIHIyICwgYzI7CiAgICBpbnQgaWQ7Cn07Cgp2ZWN0b3I8Q2FuZD4gY2FuZDsKCnZvaWQgbmVuKCl7CiAgICB2ZWN0b3I8cGFpcjxsb25nIGxvbmcgLCBsb25nIGxvbmc+PiB2MjsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IHYxOwogICAgZm9yIChndiAmQyA6IGEpewogICAgICAgIHYxLnB1c2hfYmFjayhDLngpOwogICAgICAgIHYyLnB1c2hfYmFjayh7Qy54ICwgQy55fSk7CiAgICB9CiAgICBmb3IgKENhbmQgJkMgOiBjYW5kKSBpZiAoQy50eXBlID09IDEpewogICAgICAgIHYxLnB1c2hfYmFjayhDLnIxKTsKICAgICAgICB2Mi5wdXNoX2JhY2soe0MucjEgLCBDLmMxfSk7CiAgICB9CgogICAgc29ydCh2MS5iZWdpbigpICwgdjEuZW5kKCkpOwogICAgc29ydCh2Mi5iZWdpbigpICwgdjIuZW5kKCkpOwoKICAgIHYxLmVyYXNlKHVuaXF1ZSh2MS5iZWdpbigpICwgdjEuZW5kKCkpKTsKICAgIHYyLmVyYXNlKHVuaXF1ZSh2Mi5iZWdpbigpICwgdjIuZW5kKCkpKTsKCiAgICBmb3IgKGd2ICZDIDogYSl7CiAgICAgICAgaW50IHRtcCA9IGxvd2VyX2JvdW5kKHYyLmJlZ2luKCkgLCB2Mi5lbmQoKSAsIChwYWlyPGxvbmcgbG9uZyAsIGxvbmcgbG9uZz4pe0MueCAsIEMueX0pIC0gdjIuYmVnaW4oKTsKICAgICAgICBDLnggPSBsb3dlcl9ib3VuZCh2MS5iZWdpbigpICwgdjEuZW5kKCkgLCBDLngpIC0gdjEuYmVnaW4oKSArIDE7CiAgICAgICAgQy5pZCA9IHRtcDsKICAgIH0KCiAgICBmb3IgKENhbmQgJkMgOiBjYW5kKXsKICAgICAgICBpZiAoQy50eXBlICYgMSl7CiAgICAgICAgICAgIGludCB0bXAgPSBsb3dlcl9ib3VuZCh2Mi5iZWdpbigpICwgdjIuZW5kKCkgLCAocGFpcjxsb25nIGxvbmcgLCBsb25nIGxvbmc+KXtDLnIxICwgQy5jMX0pIC0gdjIuYmVnaW4oKTsKICAgICAgICAgICAgQy5yMSA9IGxvd2VyX2JvdW5kKHYxLmJlZ2luKCkgLCB2MS5lbmQoKSAsIEMucjEpIC0gdjEuYmVnaW4oKSArIDE7CiAgICAgICAgICAgIEMuaWQgPSB0bXA7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIEMucjEgPSBsb3dlcl9ib3VuZCh2MS5iZWdpbigpICwgdjEuZW5kKCkgLCBDLnIxKSAtIHYxLmJlZ2luKCkgKyAxOwogICAgICAgICAgICBDLnIyID0gbG93ZXJfYm91bmQodjEuYmVnaW4oKSAsIHYxLmVuZCgpICwgQy5yMikgLSB2MS5iZWdpbigpICsgMTsKICAgICAgICB9CiAgICB9CgogICAgbSA9IHYxLnNpemUoKTsKfQoKdm9pZCBpbnAoKXsKICAgIGNpbiA+PiBuID4+IHE7CiAgICBmb3IgKGludCBpID0gMSA7IGkgPD0gbiA7ICsraSl7CiAgICAgICAgY2luID4+IGFbaV0ueCA+PiBhW2ldLnk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDEgOyBpIDw9IHEgOyArK2kpewogICAgICAgIGludCB0eXBlOwogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlICYgMSl7CiAgICAgICAgICAgIGxvbmcgbG9uZyByMSAsIGMxOwogICAgICAgICAgICBjaW4gPj4gcjEgPj4gYzE7CiAgICAgICAgICAgIGNhbmQucHVzaF9iYWNrKHt0eXBlICwgcjEgLCBjMSAsIDAgLCAwICwgMH0pOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBsb25nIGxvbmcgcjEgLCBjMSAsIHIyICwgYzI7CiAgICAgICAgICAgIGNpbiA+PiByMSA+PiBjMSA+PiByMiA+PiBjMjsKICAgICAgICAgICAgY2FuZC5wdXNoX2JhY2soe3R5cGUgLCByMSAsIGMxICwgcjIgLCBjMiAsIDB9KTsKICAgICAgICB9CiAgICB9CgogICAgbmVuKCk7Cn0KCnZvaWQgdXBkYXRlKGludCBpZCAsIGludCBsICwgaW50IHIgLCBpbnQgcG9zICwgbG9uZyBsb25nIHZhbCl7CiAgICBpZiAobCA+IHBvcyB8fCByIDwgcG9zKSByZXR1cm47CiAgICBpZiAobCA9PSByKXsKICAgICAgICB0W2lkXSA9IHZhbDsKICAgICAgICB0W2lkXSAlPSBNT0Q7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICB1cGRhdGUoaWQgPDwgMSAsIGwgLCBtaWQgLCBwb3MgLCB2YWwpOwogICAgdXBkYXRlKGlkIDw8IDEgfCAxICwgbWlkICsgMSAsIHIgLCBwb3MgLCB2YWwpOwogICAgdFtpZF0gPSB0W2lkIDw8IDFdICogdFtpZCA8PCAxIHwgMV07CiAgICB0W2lkXSAlPSBNT0Q7Cn0KCmxvbmcgbG9uZyBnZXQoaW50IGlkICwgaW50IGwgLCBpbnQgciAsIGludCB1ICwgaW50IHYpewogICAgaWYgKHUgPiB2KSByZXR1cm4gMDsKICAgIGlmICh1ID09IHYpIHJldHVybiAxOwogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gMTsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gdFtpZF07CgogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIGxvbmcgbG9uZyB0MSA9IGdldChpZCA8PCAxICwgbCAsIG1pZCAsIHUgLCB2KTsKICAgIGxvbmcgbG9uZyB0MiA9IGdldChpZCA8PCAxIHwgMSAsIG1pZCArIDEgLCByICwgdSAsIHYpOwoKICAgIHJldHVybiB0MSAqIHQyICUgTU9EOwp9Cgp2b2lkIHNvbHZlKCl7CiAgICBmb3IgKGd2ICZDIDogYSl7CiAgICAgICAgdXBkYXRlKDEgLCAxICwgbSAsIEMueCAsIDEpOwogICAgICAgIGNvbFtDLmlkXSA9IDE7CiAgICAgICAgKytDbnRbQy54XTsKICAgIH0KCiAgICBmb3IgKENhbmQgJkMgOiBjYW5kKXsKICAgICAgICBpZiAoQy50eXBlICYgMSl7CiAgICAgICAgICAgIGlmIChjb2xbQy5pZF0pewogICAgICAgICAgICAgICAgY29sW0MuaWRdID0gMDsKICAgICAgICAgICAgICAgIC0tQ250W0MucjFdOwogICAgICAgICAgICAgICAgdXBkYXRlKDEgLCAxICwgbSAsIEMucjEgLCBDbnRbQy5yMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBjb2xbQy5pZF0gPSAxOwogICAgICAgICAgICAgICAgKytDbnRbQy5yMV07CiAgICAgICAgICAgICAgICB1cGRhdGUoMSAsIDEgLCBtICwgQy5yMSAsIENudFtDLnIxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgY291dCA8PCBnZXQoMSAsIDEgLCBtICwgQy5yMSAsIEMucjIpIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpewovLyAgICBmcmVvcGVuKCJkaWZtYXguaW5wIiAsICJyIiAsIHN0ZGluKTsKLy8gICAgZnJlb3BlbigiZGlmbWF4Lm91dCIgLCAidyIgLCBzdGRvdXQpOwogICAgZmFzdGVyOwogICAgaW5wKCk7CiAgICBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0K