titre
N-éclairé lampe de nuit, numérotés de 1 à n.
Maintenant, il y a deux modes de fonctionnement, comme suit:
- Opération 1, pour éteindre la référence [l, r] lampe intervalle
- 2 le fonctionnement, l'étiquette ouverte [l, r] lampe intervalle
Q fois d'interrogation ci-dessous, chaque requête effectuée dans lequel un format de requête de fonctionnement, l, r, k, type de k pour effectuer des opérations. Pour chaque demande de répondre au nombre actuel de lampe ouvert.
Contribution
Un seul ensemble d'entrées, une première ligne contient un nombre entier n, une deuxième rangée un entier q (1≤n≤10 ^ 9,1≤q≤3 · 10 ^ 5)
La ligne suivante 3 de chaque rangée représente un nombre entier de requête q, l, r, k (1 ≤ l ≤ r ≤ n, 1 ≤ k ≤ 2).
Production
Pour chaque demande de répondre à un nombre entier par ligne représente la réponse.
Exemple
4
6
1 2 1
3 4 1
2 3 2
1 3 2
2 4 1
1 4 2
2
0
2
3
1
4
solution:
Parce que la ligne d'arbre à l'espace ouvert quatre fois. Mais le visage des données énormes que nous maxn << 2 espace ouvert est ouvert certainement le trop-plein.
À ce moment, nous devrions utiliser l'arbre de segment de prescription dynamique pour sauver l'espace. (Ou discret)
point ouvert dynamique qui est utilisé lorsque le nœud est seul espace alloué à elle, ou non alloué, sur des questions telles que la taille de n est 1e9, puis ouvrez la statique est certainement la place pour frites ,,, mais vous le trouver 3e5 a également demandé une gamme, visible utilisée dans une minorité, donc chaque fois que nous lui donnons à utiliser une gamme d'espace de distribution
code:
1 / * 2 动态开点线段树 3 * / 4 #include <stdio.h> 5 #include < string .h> 6 #include <iostream> 7 #include <algorithme> 8 #include <file> 9 #include < vecteur> 10 en utilisant l' espace de noms std; 11 const int maxn = 3e5 + 10 ; 12 const int INF = 0x3f3f3f3f ; 13 typedef longue longue ll; 14 struct Node 15 { 16 int L, R & lt, SUM, paresseux; . 17 l'arbre () 18 est { 19. L = 0 , R & lt = 0 , SUM = 0 , le lazy = 0 ; 20 est } 21 est } Noeud [MAXN * 50 ]; la figure 22 est int CNT = 1. ; // nombre de points pour ouvrir 23 est vide pushdown ( int l, int R & lt, int K) // K est le numéro de noeud parent dans le tableau 24 { 25 int MID = (l + R & lt) >> 1. ; 26 est SI(l =! r) 27 { 28 si (noeud [k] .l!) noeud [k] .l = ++ cnt; 29 si (! Noeud [k] .r) noeud [k] .r = ++ cnt; 30 31 si (noeud [k] .lazy == 2 ) 32 { 33 nœud [noeud [k] .l] .sum = noeud [noeud [k] .r] .sum = 0 ; 34 } 35 autre 36 { 37 nœud [noeud [k] .l] .sum = mi-l + 1 ; 38 node [noeud [k] .r] .sum = r- milieu; 39 } 40 Noeud [Node [K] .L] = .lazy noeud [K] .lazy; 41 est Noeud [Node [K] .r] = .lazy noeud [K] .lazy; 42 est } 43 est Noeud [K] .lazy = 0 ; 44 } 45 // à l' arbre de segment est inséré à l' intérieur d' un intervalle [l, R & lt] 46 est vide l'insert ( int l, int R & lt, int & K, int l, int R & lt, int P) 47 { 48 IF (! K) K = cnt ++; // cela , il est équivalent à k nous voulons noeud [k] ce noeud fonctionne 49 // le nœud [1] est le nœud racine, car cela est une dynamique nous point ouvert, donc il n'y a pas de nœuds points sont ouverts la valeur initiale de 0 50 SI(L> = R & lt && L <= R & lt) // s'il n'y a pas besoin de répondre à cette pushdown condition, parce que nous ne avons pas besoin les noeuds suivants peuvent être obtenus [l, r] dans la section de réponse 51 est { 52 est SI (P == 2 ) Node [K] .sum = 0 ; 53 est l'autre noeud [K] = R & lt .sum-l + 1. ; 54 est Noeud [K] .lazy = P; 55 rendement ; 56 est } 57 est // Si non la détermination ci - dessus, nous entrerons au sujet de nœud enfant récursive k, cette fois vous devez vous assurer que les sous-points ont été modifiés et 58 // par exemple, paresseux paresseux est étiquetée 0 59 IF (le noeud [k] .lazy) pushdown (l, R & lt, K); 60 int MID = (L + R & lt) >> . 1 ; 61 est SI (MID> =L) Insert (l, milieu, noeud [k] .l, L, R, p); 62 si (mi <R) Insert (mi + 1 , r, noeud [k] .r, L, R, p); 63 node [k] = .sum noeud [noeud [k] .l] .sum + noeud [noeud [k] .r] .sum; 64 } 65 int main () 66 { 67 // printf ( "% d% d \ n", au noeud [1] .l, au noeud [1] .r); 68 int n, q; 69 scanf ( " % d% d " , et n, et q); 70 int k = 1 ; 71 pour ( int i = 1 ; i <= q; i ++ ) 72 { 73 int l, r, p; 74 scanf ( " % d% d% d " , & l, & r, et p); 75 Insert ( 1 , n, k, l, r, p); 76 printf ( " % d \ n " , n-noeud [ 1 ] .sum); 77 } 78 retour 0 ; 79 }