题意:
给定两个操作:
MULTIPLY L R x 区间里都乘以一个数x
MAX L R : 计算区间内一个2,3,5,7个数最大值。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10 ; 4 int Max[N<<2][4] ; 5 int Add[N<<2][4] ; 6 7 const int prime[] = { 2 , 3 , 5 , 7 }; 8 9 void Push_Down( int Id , int val ){ 10 if( Add[Id][val] ){ 11 Add[Id << 1 ][ val ] += Add[ Id ][ val ]; 12 Add[Id << 1 | 1 ][ val ] += Add[ Id ][ val ]; 13 14 Max[Id << 1 ][ val ] += Add[ Id ][ val ]; 15 Max[Id << 1 | 1 ][ val ] += Add[ Id ][ val ]; 16 17 Add[Id][val] = 0 ; 18 } 19 } 20 21 void Update( int Id ,int L , int R , int x , int y , int val ){ 22 if( x <= L && R <= y ){ 23 Max[Id][val] ++ ; 24 Add[Id][val] ++ ; 25 return ; 26 } 27 int Mid = L + R >> 1 ; 28 Push_Down( Id , val ); 29 30 if( x <= Mid ){ 31 Update( Id << 1 , L , Mid , x , y , val ); 32 } 33 if( Mid < y ){ 34 Update( Id << 1 | 1 , Mid + 1 , R , x , y , val ); 35 } 36 37 Max[Id][val] = max( Max[ Id<<1 ][val] , Max[ Id<<1 | 1 ][val] ); 38 } 39 40 int Query( int Id , int L , int R , int x , int y ,int val ){ 41 if( x <= L && R <= y ){ 42 return Max[Id][val] ; 43 } 44 int Mid = L + R >> 1 ; 45 int res = 0 ; 46 47 Push_Down( Id , val ); 48 if( x <= Mid ){ 49 res = max( res , Query( Id << 1 , L , Mid , x , y , val ) ); 50 } 51 if( Mid < y ){ 52 res = max( res , Query( Id << 1 | 1 , Mid+1 , R , x , y , val ) ); 53 } 54 return res ; 55 } 56 57 int main() 58 { 59 int n , Q ; 60 scanf("%d%d",&n,&Q); 61 while( Q-- ){ 62 char s[10] ; 63 int L , R , x , res ; 64 scanf("%s",s); 65 if( s[1] == 'U' ){ 66 scanf("%d%d%d",&L,&R,&x); 67 for( int i = 0 ; i < 4 ; i ++ ){ 68 if( x % prime[i] == 0 ){ 69 while( x % prime[i] == 0 ){ 70 Update( 1 , 1 , n , L , R , i ); 71 x /= prime[i] ; 72 } 73 } 74 } 75 }else{ 76 scanf("%d%d",&L,&R); 77 res = 0 ; 78 for( int i = 0 ; i < 4 ; i++ ){ 79 int tmp = Query( 1 , 1 , n , L , R , i ); 80 if( tmp > res ) res = tmp ; 81 } 82 printf("ANSWER %d ",res); 83 } 84 } 85 return 0; 86 }