#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; struct unionfind{ vector par, sz; unionfind() {} unionfind(int n):par(n), sz(n, 1){ for(int i=0; isz[y]) swap(x, y); par[x]=y; sz[y]+=sz[x]; } bool same(int x, int y){ return find(x)==find(y); } int size(int x){ return sz[find(x)]; } }; template struct LazySegmentTree{ using F=function; using G=function; using H=function; int sz; vector data; vector lazy; const F f; const G g; const H h; const Monoid e1; const OperatorMonoid e0; LazySegmentTree(int n, const F f, const G g, const H h, const Monoid &e1, const OperatorMonoid &e0): f(f), g(g), h(h), e1(e1), e0(e0){ sz=1; while(sz v){ for(int i=0; i=0; i--) data[i]=f(data[2*i+1], data[2*i+2]); } void eval(int k, int l, int r){ if(lazy[k]!=e0){ data[k]=g(data[k], lazy[k], r-l); if(k>n>>m; int l[200020], r[200020], p[200020]; int c=0; for(int i=0; i>l[i]>>r[i]>>p[i]; l[i]--; if(p[i]!=0) c++; } int ri[200020]; fill(ri, ri+n+1, -1); for(int i=0; i=MOD) z-=MOD; return z; }; auto G=[&](ll a, ll x, int len){ return x*len%MOD; }; auto h=[&](ll x, ll y){ return y; }; LazySegmentTree seg(n+1, f, G, h, 0, -1); seg.update(0, 1, 1); for(int i=1; i<=n; i++){ int k=ri[i]; if(k>=0 && p[k]!=0){ seg.update(l[k]+1, n+1, 0); }else{ seg.update(i, i+1, seg.find(0, i)*((MOD+1)/2)%MOD); if(k>=0 && p[k]==0){ seg.update(0, l[k]+1, 0); } } } ll ans=seg.find(0, n+1); for(int i=0; i