| 12
 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
 
 | #include<bits/stdc++.h>#define int long long
 using namespace std;
 typedef pair<int, int> PII;
 
 constexpr int mod = 1e9 + 7;
 
 int qmi(int a, int k, int p){
 int res = 1;
 while(k){
 if(k & 1) res = res * a % p;
 a = a * a % p;
 k >>= 1;
 }
 return res;
 }
 
 void solve(){
 int n, m; cin >> n >> m;
 
 vector<int>lg(n + 1);
 for(int i = 2; i <= n; i++){
 lg[i] = lg[i >> 1] + 1;
 }
 
 vector<vector<int>>p(n, vector<int>(lg[n] + 1));
 for(int j = 0; j <= lg[n]; j++){
 for(int i = 0; i + (1 << j) - 1 < n; i++){
 p[i][j] = i;
 }
 }
 function<int(int, int)>find = [&](int x, int d){
 return x == p[x][d] ? x : p[x][d] = find(p[x][d], d);
 };
 auto merge = [&](int x, int y, int d){
 int fx = find(x, d), fy = find(y, d);
 if(fx == fy) return;
 p[fx][d] = fy;
 };
 
 for(int i = 0; i < m; i++){
 int a, b, c, d;
 cin >> a >> b >> c >> d;
 a--, b--, c--, d--;
 int k = lg[b - a + 1];
 merge(a, c, k);
 merge(b - (1 << k) + 1, d - (1 << k) + 1, k);
 }
 
 for(int k = lg[n]; k >= 1; k--){
 for(int i = 0; i + (1 << k) - 1 < n; i++){
 int fi = find(i, k);
 if(i == fi) continue;
 merge(i, fi, k - 1);
 merge(i + (1 << k - 1), fi + (1 << k - 1), k - 1);
 }
 }
 
 int cnt = 0;
 for(int i = 0; i < n; i++){
 if(i == find(i, 0)) cnt++;
 }
 
 cout << 9 * qmi(10, cnt - 1, mod) % mod << '\n';
 }
 
 signed main(){
 ios::sync_with_stdio(0);
 cin.tie(0);
 solve();
 return 0;
 }
 
 |