1 2 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
| #include <cstdio>
using ll = long long; const int MaxM = 100500, mod = 998244353;
struct Node { ll pre, suf; int l, r; bool fl; } a[MaxM*100];
int tot; ll qL, qR; void add(ll l, ll r, int &u) { if (qR<=l || r<=qL) return; if (!u) u = ++tot; if (qL<=l && r<=qR) { a[u].fl = 1; return; } ll mid = (l+r)/2; add(l, mid, a[u].l); add(mid, r, a[u].r); }
int ans; void dfs(ll l, ll r, int u) { if (!u) { ans = (ans+((r-l+1)%(mod*2))*((r-l)%(mod*2))/2)%mod; return; } if (l+1==r) { ans += (a[u].pre=a[u].suf=!a[u].fl); return; } ll mid=(l+r)/2; dfs(l,mid,a[u].l); dfs(mid,r,a[u].r); ll sl = a[u].l ? a[a[u].l].suf : mid-l, pl = a[u].l ? a[a[u].l].pre : mid-l, sr = a[u].r ? a[a[u].r].suf : r-mid, pr = a[u].r ? a[a[u].r].pre : r-mid; ans = (ans+(sl%mod)*(pr%mod))%mod; int fl = 0; if (!a[a[u].l].fl&&!a[a[u].r].fl&&a[u].fl) fl=-1; if ((a[a[u].l].fl||a[a[u].r].fl)&&!a[u].fl) fl=1; ans += fl; a[u].pre = pl+(a[a[u].l].fl ? 0 : pr)+fl; a[u].suf = sr+(a[a[u].r].fl ? 0 : sl)+fl; }
int main() { ll N; int M; scanf("%lld%d", &N, &M); int rt=0; for (int i=1; i<=M; i++) { scanf("%lld%lld", &qL, &qR); qL--; add(0, N, rt); } dfs(0, N, rt); printf("%d", (ans+mod)%mod); return 0; }
|