rt,找不到 UB.
#include <iostream>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <string.h>
#include <queue>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int n, m;
int fa[N][30];
int find(int x, int k)
{
return (fa[x][k] == x ? x : fa[x][k] = find(fa[x][k], k));
}
int merge(int x, int y, int k)
{
int fx = find(fa[x][k], k);
int fy = find(fa[y][k], k);
if(fx != fy) fa[fx][k] = fy;
}
int lg[N];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= lg[n]; j++)
{
fa[i][j] = i;
}
}
for(int i = 1; i <= m; i++)
{
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
for(int k = lg[n]; ~k; k--)
{
if(l1 + (1 << k) - 1 <= r1)
{
merge(l1, l2, k);
l1 += (1 << k);
l2 += (1 << k);
}
}
}
for(int k = lg[n]; k; k--)
{
for(int i = 1; i + (1 << k) - 1 <= n; i++)
{
int fi = find(i, k);
merge(i, fi, k - 1);
merge(i + (1 << k - 1), fi + (1 << k - 1), k - 1);
}
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(fa[i][0] == i)
{
if(!ans) ans = 9;
else ans = (ans * 10) % mod;
}
}
cout << ans << endl;
return 0;
}