#include <iostream> using namespace std; const int M=1048576; int n, a, b, c; struct tree{ int v, w; }d[2*M]; void insert(int a, int b, int OD, int DO, int v, int c){ if(a<=OD && b>=DO) d[v].v|=c; else{ int tmp=(OD+DO)/2; if(a<=tmp) insert(a, b, OD, tmp, v*2, c); if(b>tmp) insert(a, b, tmp+1, DO, v*2+1, c); d[v].w=d[v*2].v | d[v*2].w | d[v*2+1].v | d[v*2+1].w; } } int query(int a, int b, int OD, int DO, int v, int s){ if(a<=OD && b>=DO) return s | d[v].v | d[v].w; int res=0, tmp=(OD+DO)/2; if(a<=tmp) res+=query(a, b, OD, tmp, v*2, (s | d[v].v)); if(b>tmp) res+=query(a, b, tmp+1, DO, v*2+1, (s | d[v].v)); return res; } int main(){ ios::sync_with_stdio(0); int n, m; cin>>n>>m; for(int i=0; i<m; i++){ int a, b, c; cin>>a>>b>>c; if(c==3)c=4; insert(a, b, 0, M-1, 1, c); } int res=0; for(int i=1; i<=n; i++){ if(query(i, i, 0, M-1, 1, 0) == 3) res++; } cout<<res<<"\n"; }
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 | #include <iostream> using namespace std; const int M=1048576; int n, a, b, c; struct tree{ int v, w; }d[2*M]; void insert(int a, int b, int OD, int DO, int v, int c){ if(a<=OD && b>=DO) d[v].v|=c; else{ int tmp=(OD+DO)/2; if(a<=tmp) insert(a, b, OD, tmp, v*2, c); if(b>tmp) insert(a, b, tmp+1, DO, v*2+1, c); d[v].w=d[v*2].v | d[v*2].w | d[v*2+1].v | d[v*2+1].w; } } int query(int a, int b, int OD, int DO, int v, int s){ if(a<=OD && b>=DO) return s | d[v].v | d[v].w; int res=0, tmp=(OD+DO)/2; if(a<=tmp) res+=query(a, b, OD, tmp, v*2, (s | d[v].v)); if(b>tmp) res+=query(a, b, tmp+1, DO, v*2+1, (s | d[v].v)); return res; } int main(){ ios::sync_with_stdio(0); int n, m; cin>>n>>m; for(int i=0; i<m; i++){ int a, b, c; cin>>a>>b>>c; if(c==3)c=4; insert(a, b, 0, M-1, 1, c); } int res=0; for(int i=1; i<=n; i++){ if(query(i, i, 0, M-1, 1, 0) == 3) res++; } cout<<res<<"\n"; } |