#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;
}
