#include <iostream> using namespace std; int r = 2; int wyn = 0; struct kolor { int niebiski = 0; int zolty = 0; int czerwony = 0; bool ziel() { if (niebiski && zolty && (!czerwony))return 1; else return 0; } kolor operator+(const kolor& b) { kolor k; k.niebiski = this->niebiski + b.niebiski; k.czerwony = this->czerwony + b.czerwony; k.zolty = this->zolty + b.zolty; return k; } }; struct node{ kolor val; node* left=NULL; node* right=NULL; bool lisc = 0; }; void create(node* root,int l,int maxl) { if (l > maxl)return; root->right = new node; root->left = new node; if (l == maxl) { root->left->lisc = 1; root->right->lisc = 1; return; } create(root->right,l+1,maxl); create(root->left, l+1, maxl); } void insert(node* root, int p, int q, kolor val ,int dp = 0, int dq = r - 1); void insert(node* root, int p, int q, kolor val ,int dp, int dq ) { if (p <= dp and dq <= q) { root->val =root->val+ val; } else if (dq < p or q < dp) { return; } else { long long pp = 1 + (dq - dp) / 2; insert(root->left,p,q, val,dp,dq-pp); insert(root->right,p,q,val,dp+pp,dq); } } void query(node* root, int ind,kolor przep, int dp = 0, int dq = r - 1); void query(node* root,int ind,kolor przep, int dp, int dq) { przep = przep + root->val; if (ind <= dp and dq <= ind) { wyn += przep.ziel(); return; } else if (dq < ind or ind < dp) { return ; } else { long long pp = 1 + (dq - dp) / 2; query(root->left, ind,przep, dp, dq - pp); query(root->right, ind,przep, dp + pp, dq); } } int main() { int n, m; cin >> n >> m; int ml = 0; while (r<n) { r *= 2; ml++; } node* root = new node; create(root, 0, ml); for (int i = 0; i < m; ++i) { int pl, pr, k; cin >> pl >> pr >> k; kolor tmp; if (k == 1)tmp.zolty = 1; if (k == 2)tmp.niebiski = 2; if (k == 3)tmp.czerwony = 3; insert(root, pl, pr, tmp); } for (int i = 0; i < n; ++i) { kolor pom; query(root,i,pom); } cout << wyn<<endl; }
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> using namespace std; int r = 2; int wyn = 0; struct kolor { int niebiski = 0; int zolty = 0; int czerwony = 0; bool ziel() { if (niebiski && zolty && (!czerwony))return 1; else return 0; } kolor operator+(const kolor& b) { kolor k; k.niebiski = this->niebiski + b.niebiski; k.czerwony = this->czerwony + b.czerwony; k.zolty = this->zolty + b.zolty; return k; } }; struct node{ kolor val; node* left=NULL; node* right=NULL; bool lisc = 0; }; void create(node* root,int l,int maxl) { if (l > maxl)return; root->right = new node; root->left = new node; if (l == maxl) { root->left->lisc = 1; root->right->lisc = 1; return; } create(root->right,l+1,maxl); create(root->left, l+1, maxl); } void insert(node* root, int p, int q, kolor val ,int dp = 0, int dq = r - 1); void insert(node* root, int p, int q, kolor val ,int dp, int dq ) { if (p <= dp and dq <= q) { root->val =root->val+ val; } else if (dq < p or q < dp) { return; } else { long long pp = 1 + (dq - dp) / 2; insert(root->left,p,q, val,dp,dq-pp); insert(root->right,p,q,val,dp+pp,dq); } } void query(node* root, int ind,kolor przep, int dp = 0, int dq = r - 1); void query(node* root,int ind,kolor przep, int dp, int dq) { przep = przep + root->val; if (ind <= dp and dq <= ind) { wyn += przep.ziel(); return; } else if (dq < ind or ind < dp) { return ; } else { long long pp = 1 + (dq - dp) / 2; query(root->left, ind,przep, dp, dq - pp); query(root->right, ind,przep, dp + pp, dq); } } int main() { int n, m; cin >> n >> m; int ml = 0; while (r<n) { r *= 2; ml++; } node* root = new node; create(root, 0, ml); for (int i = 0; i < m; ++i) { int pl, pr, k; cin >> pl >> pr >> k; kolor tmp; if (k == 1)tmp.zolty = 1; if (k == 2)tmp.niebiski = 2; if (k == 3)tmp.czerwony = 3; insert(root, pl, pr, tmp); } for (int i = 0; i < n; ++i) { kolor pom; query(root,i,pom); } cout << wyn<<endl; } |