fork download
  1. #include <iostream>
  2. #include <math.h>
  3. #include <cstring>
  4. using namespace std;
  5. int updateUtil(int* st,int i,int value,int i1,int j1,int id){
  6. if (i1==j1 && i1==i){
  7. st[id-1]=value;
  8. return value;
  9. }
  10. else if ((i1<i&&j1<i) || (i1>i && j1>i)) {
  11. return st[id-1];
  12. }
  13. st[id-1]=updateUtil(st,i,value,i1,(i1+j1)/2,id*2)* updateUtil(st,i,value,((i1+j1)/2)+1,j1,(id*2)+1);
  14. return st[id-1];
  15.  
  16. }
  17. void update(int * st,int i,int value,int n){
  18. updateUtil(st,i,value,1,n,1);
  19. }
  20. int getSumaUtil(int* st,int i,int j,int i1,int j1,int id){
  21. if (i1>=i && j1<=j) return st[id-1];
  22. else if ((i1<i&&j1<i) || (i1>j && j1>j)) {
  23. return 1;
  24. }
  25. return getSumaUtil(st,i,j,i1,(i1+j1)/2,id*2)* getSumaUtil(st,i,j,((i1+j1)/2)+1,j1,(id*2)+1);
  26. }
  27. int getSuma(int * st,int i,int j,int n){
  28. return getSumaUtil(st,i,j,1,n,1);
  29. }
  30. int segmentTree(int * values,int * st ,int i,int j,int id){
  31. if (i==j) {
  32. st[id-1]=values[i-1];
  33. return st[id-1];
  34. }
  35. st[id-1]= segmentTree(values,st,i,(i+j)/2,2*id)* segmentTree(values,st,((i+j)/2)+1,j,(2*id)+1);
  36. return st[id-1];
  37.  
  38. }
  39. int * buildSegmentTree(int* ar,int size){
  40. int s = pow(2,ceil(log2(size))+1)-1;
  41. int *st = new int[s];
  42. memset(st,s,1);
  43. segmentTree(ar,st,1,size,1);
  44. return st;
  45. }
  46. int main(){
  47. int n,q,in,fin,aux;
  48. char c;
  49. while (cin>>n>>q){
  50. string cade="";
  51. int ar[n];
  52. for (int i=0;i<n;i++){
  53. scanf("%d",&aux);
  54. if (aux==0) ar[i]=0;
  55. else if (aux>0) ar[i]=1;
  56. else ar[i]=-1;
  57. }
  58.  
  59. int * st = buildSegmentTree(ar,n);
  60. for (int i=0;i<q;i++){
  61. cin.ignore();
  62. scanf ("%c %d %d",&c,&in,&fin);
  63. if (c=='C'){
  64. if (fin==0)fin=0;
  65. else if (fin>0) fin=1;
  66. else fin=-1 ;
  67. update(st,in,fin,n);
  68. }
  69. else {
  70. int res= getSuma(st,in,fin,n);
  71. cout<<res<<endl;
  72. if (res==0) cade+="0";
  73. else if (res>0) cade+="+";
  74. else cade+="-";
  75. }
  76. }
  77. cout<<cade<<endl;
  78.  
  79.  
  80. }
  81. }
  82.  
Success #stdin #stdout 0s 4392KB
stdin
12 6
-58 41 -10 -21 -3 -86 81 -78 82 66 -86 44 
P 8 10
P 11 11
P 9 11
P 7 8
P 12 12
P 8 11
stdout
1
-1
-1
-1
-1
1
+----+