#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;
const ll p = 1e9+7;
const ll Nm = 524288; const ll E = 19;
const ll K = 26;
ll dpU[Nm][K]; //dp up
ll dpD[Nm][K]; //dp down
ll stU[2*Nm]; //segtree of jump up (increase)
ll stD[2*Nm]; //segtree of jump down (decrease)
void wtU(ll a, ll b) {
ll sp = a+Nm;
do {
stU[sp]=max(stU[sp],b); sp=sp/2;
} while (sp>0);
}
inline ll v2(ll x) {
return __builtin_ctz(x);
}
ll rdU(ll l, ll r) {
if (l>r) {return -1;}
ll vl = v2(l); ll vr = v2(r+1);
if (vl<vr) {
return max(stU[(l>>vl)+(1<<(E-vl))],rdU(l+(1<<vl),r));
} else {
return max(stU[(r>>vr)+(1<<(E-vr))],rdU(l,r-(1<<vr)));
}
}
ll rdD(ll l, ll r) {
if (l>r) {return -1;}
ll vl = v2(l); ll vr = v2(r+1);
if (vl<vr) {
return max(stD[(l>>vl)+(1<<(E-vl))],rdD(l+(1<<vl),r));
} else {
return max(stD[(r>>vr)+(1<<(E-vr))],rdD(l,r-(1<<vr)));
}
}
void wtD(ll a, ll b) {
ll sp = a+Nm;
do {
stD[sp]=max(stD[sp],b); sp=sp/2;
} while (sp>0);
}
int main() {
ll ans = 0;
ll N,M; cin >> N >> M;
for (ll i=Nm;i<(2*Nm);i++) {
stU[i]=i-Nm;
stD[i]=i-Nm;
}
for (ll ps=(Nm-1);ps>=1;ps--) {
stU[ps]=max(stU[2*ps],stU[2*ps+1]);
stD[ps]=max(stD[2*ps],stD[2*ps+1]);
}
for (ll m=0;m<M;m++) {
ll a,b; cin >> a >> b; a--; b--; //T_a <= T_b
if (a<b) {
wtU(a,b); //T_b is higher aka next char is down
} else {
wtD(b,a);
}
}
for (ll i=(Nm-1);i>=0;i--) {
wtU(i,rdU(i,stU[i+Nm]));
wtD(i,rdD(i,stD[i+Nm]));
}
for (ll i=0;i<=N;i++) {
for (ll k=0;k<K;k++) {
dpU[i][k]=0;
dpD[i][k]=0;
}
}
for (ll i=0;i<N;i++) {
vector<ll> dpV(K,0);
if (i==0) {
for (ll k=0;k<K;k++) {
dpV[k]=1;
}
} else {
ll psup = 0;
for (ll k=0;k<K;k++) {
dpV[k]+=psup;
psup += dpU[i][k]; psup %= p;
}
ll psdn = 0;
for (ll k=(K-1);k>=0;k--) {
dpV[k]+=psdn;
psdn += dpD[i][k]; psdn %= p;
}
}
for (ll k=0;k<K;k++) {
ans = (ans+dpV[k])%p;
dpU[i][k] += dpV[k]; dpU[i][k]%=p;
dpU[1+stD[i+Nm]][k] = (dpU[1+stD[i+Nm]][k]+dpU[i][k])%p;
dpD[i][k] += dpV[k]; dpD[i][k]%=p;
dpD[1+stU[i+Nm]][k] = (dpD[1+stU[i+Nm]][k]+dpD[i][k])%p;
}
}
cout << ans << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |