RT,感觉是哪里写挂了,但是数据太水过了7个点,调了一下午了,求求谷内大佬帮忙调试 /bx
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
typedef pair<int,int> PII;
const int N=2e5+10;
const int M=4e6+10;
const long long MOD=1e9+7;
int n,m,cnt,num[N][20],r[N][20],fa[M],siz[M],mp[N];
long long ans=1;
PII dfo[M];
set<int> q;
inline int find(int x){
if(fa[x]==x){
return x;
}
return fa[x]=find(fa[x]);
}
inline void unify(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy){
return;
}
if(siz[fx]<siz[fy]){
swap(fx,fy);
}
siz[fx]+=siz[fy];
fa[fy]=fx;
}
inline void prepare(){
for(int i=1;i<=n;i++){
for(int j=20;j>=0;j--){
if(!num[i][j]){
continue;
}
if(fa[num[i][j]]==num[i][j]){
continue;
}
PII t=dfo[find(num[i][j])];
if(j!=0){
unify(num[t.first][t.second-1],num[i][j-1]);
unify(num[r[t.first][t.second-1]+1][t.second-1],num[r[i][j-1]+1][j-1]);
}
}
}
}
int main(){
freopen("P3295_1.in","r",stdin);
freopen("P3295.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=0;i+(1<<j)-1<=n;j++){
num[i][j]=++cnt;
dfo[cnt]=PII(i,j);
r[i][j]=i+(1<<j)-1;
fa[cnt]=cnt;
if(j==0){
mp[i]=cnt;
}
}
}
int l1,l2,r1,r2;
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
int len=r1-l1+1;
while(len){
int ws=32-__builtin_clz(len);
unify(num[l1][ws-1],num[l2][ws-1]);
l1=r[l1][ws-1]+1;
l2=r[l2][ws-1]+1;
len-=(1<<(ws-1));
}
}
prepare();
for(int i=1;i<=n;i++){
int bef=q.size();
q.insert(find(mp[i]));
if(q.size()!=bef){
if(i==1){
ans*=9;
}
else{
ans*=10;
ans%=MOD;
}
}
}
printf("%lld\n",ans);
}