#include <iostream>
#include <cmath>
#define SIZE 1000000
#define YELOW 1
#define BLUE 2
#define RED 4
#define GREEN 3
using namespace std;
//odcinki zó³te 1 * odcinki niebieskie 2 \ odcinki czerwone 3
//1 zó³ty 2^0 1
//2 niebieski 2^1 2
//4 czerwony 2^2 3
inline int getParent(int vertex){
return vertex/2;
}
inline int leftChild(int vertex){
return vertex*2;
}
inline int rightChild(int vertex){
return vertex*2+1;
}
inline int layerNum(int vertex){
return log2(vertex);
}
int tree[2*SIZE+100];
int layers;
inline int leftCanNumber(int vertex){
int exponent = layers-layerNum(vertex);
return pow(2,exponent)*vertex;
}
inline int rightCanNumber(int vertex){
int exponent = layers-layerNum(vertex);
return leftCanNumber(vertex)+pow(2,exponent)-1;
}
inline int ConvertCanToVertex(int can){
return pow(2,layers)-1+can;
}
void setInterval(int start, int end, int vertex, int color){
//cout<<"("<<start<<";"<<end<<") at "<<vertex<<endl;
//printf("(%d<=%d && %d>=%d)\n",start,leftCanNumber(vertex),end,rightCanNumber(vertex));
//if(layerNum(vertex)==layers) return;
if(start<=leftCanNumber(vertex) && end>=rightCanNumber(vertex)){
//cout<<"Setting "<<vertex<<" from "<<tree[vertex]<<" to "<<(tree[vertex] | color)<<"||";
tree[vertex]=tree[vertex] | color;
//cout<<tree[vertex]<<endl;
}
else{
if(start<=rightCanNumber(leftChild(vertex)))
setInterval(start, end, leftChild(vertex), color);//propaguj do lewego
if(end>=leftCanNumber(rightChild(vertex)))
setInterval(start, end, rightChild(vertex), color);//propaguj do prawego
}
}
void finalRun(){
int temp = pow(2,layers)-1;
for(int i = 1; i<=temp; i++){
tree[leftChild(i)] = tree[leftChild(i)] | tree[i];
tree[rightChild(i)] = tree[rightChild(i)] | tree[i];
}
}
int countGreen(){
int temp = pow(2,layers)-1;
int counter=0;
for(int i = temp; i<temp*2+1;i++){
if(tree[i]==GREEN) counter++;
}
return counter;
}
int convertColor(int col){
if(col==1)return 1;
if(col==2)return 2;
if(col==3)return 4;
}
int main(){
int can,moves;
scanf("%d %d", &can, &moves);
int counter=0;
while(pow(2,counter)<can)
counter++;
layers=counter;
for(int i = 0; i<moves; i++){
int start,end,col;
scanf("%d %d %d", &start, &end, &col);
setInterval(ConvertCanToVertex(start),ConvertCanToVertex(end),0,convertColor(col));
}
finalRun();
printf("%d\n",countGreen());
return 0;
}
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 | #include <iostream> #include <cmath> #define SIZE 1000000 #define YELOW 1 #define BLUE 2 #define RED 4 #define GREEN 3 using namespace std; //odcinki zó³te 1 * odcinki niebieskie 2 \ odcinki czerwone 3 //1 zó³ty 2^0 1 //2 niebieski 2^1 2 //4 czerwony 2^2 3 inline int getParent(int vertex){ return vertex/2; } inline int leftChild(int vertex){ return vertex*2; } inline int rightChild(int vertex){ return vertex*2+1; } inline int layerNum(int vertex){ return log2(vertex); } int tree[2*SIZE+100]; int layers; inline int leftCanNumber(int vertex){ int exponent = layers-layerNum(vertex); return pow(2,exponent)*vertex; } inline int rightCanNumber(int vertex){ int exponent = layers-layerNum(vertex); return leftCanNumber(vertex)+pow(2,exponent)-1; } inline int ConvertCanToVertex(int can){ return pow(2,layers)-1+can; } void setInterval(int start, int end, int vertex, int color){ //cout<<"("<<start<<";"<<end<<") at "<<vertex<<endl; //printf("(%d<=%d && %d>=%d)\n",start,leftCanNumber(vertex),end,rightCanNumber(vertex)); //if(layerNum(vertex)==layers) return; if(start<=leftCanNumber(vertex) && end>=rightCanNumber(vertex)){ //cout<<"Setting "<<vertex<<" from "<<tree[vertex]<<" to "<<(tree[vertex] | color)<<"||"; tree[vertex]=tree[vertex] | color; //cout<<tree[vertex]<<endl; } else{ if(start<=rightCanNumber(leftChild(vertex))) setInterval(start, end, leftChild(vertex), color);//propaguj do lewego if(end>=leftCanNumber(rightChild(vertex))) setInterval(start, end, rightChild(vertex), color);//propaguj do prawego } } void finalRun(){ int temp = pow(2,layers)-1; for(int i = 1; i<=temp; i++){ tree[leftChild(i)] = tree[leftChild(i)] | tree[i]; tree[rightChild(i)] = tree[rightChild(i)] | tree[i]; } } int countGreen(){ int temp = pow(2,layers)-1; int counter=0; for(int i = temp; i<temp*2+1;i++){ if(tree[i]==GREEN) counter++; } return counter; } int convertColor(int col){ if(col==1)return 1; if(col==2)return 2; if(col==3)return 4; } int main(){ int can,moves; scanf("%d %d", &can, &moves); int counter=0; while(pow(2,counter)<can) counter++; layers=counter; for(int i = 0; i<moves; i++){ int start,end,col; scanf("%d %d %d", &start, &end, &col); setInterval(ConvertCanToVertex(start),ConvertCanToVertex(end),0,convertColor(col)); } finalRun(); printf("%d\n",countGreen()); return 0; } |
English