100% 的数据,1 ≤ n ≤ 105, 1 ≤ m ≤ 105, 1 ≤ li1, ri1, li2, ri2≤ n,并且保证 ri1− li1= ri2− li2
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 1e6+5500;;
const int M = 160009;
const int mod = 1e9+7;
const double pi= acos(-1.0);
typedef pair<int,int>pii;
int n,m,T;
int up[N],go[N],fa[20][N];
int findfa(int k,int x){
return x==fa[k][x]?x:fa[k][x]=findfa(k,fa[k][x]);
}
void unionfa(int k,int x,int y){
int X = x,Y = y;
x=findfa(k,x);
y=findfa(k,y);
if(x==y)return;
fa[k][x]=y;
if(!k)return;
unionfa(k-1,X,Y);
unionfa(k-1,X+(1<<k-1),Y+(1<<k-1));
}
int main(){
scanf("%d%d",&n,&m);
for(int j=0;j<20;j++)for(int i=0;i<N;i++)fa[j][i]=i;
for(int i=0,l1,r1,l2,r2;i<m;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1>l2){
swap(l1,l2);swap(r1,r2);
}
int k=log2(r1-l1+1);
unionfa(k,l1,l2);unionfa(k,r1-(1<<k)+1,r2-(1<<k)+1);
}
int cnt=0;
ll ans=9;
for(int i=1;i<=n;i++){
if(findfa(0,i)==i)cnt++;
}
for(int i=0;i<cnt-1;i++){
ans=ans*10%mod;
}
if(n==1)puts("10");
else printf("%lld\n",ans);
return 0;
}