Advertisement
Guest User

Untitled

a guest
Jan 24th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int peak(int a, int b, int *q, int k){
  6. if(k==1){
  7. return 1;
  8. }
  9. int i=0;
  10. int c=0;
  11. if(a==0 && q[a+1]<=q[a]) {
  12. c++;
  13. }
  14. if(b==k-1 && q[b]>=q[b-1]){
  15. c++;
  16. }
  17. i=a;
  18. while(i<=b){
  19. if(i!=0 && i!=k-1 && q[i-1]<=q[i] && q[i+1]<=q[i]) {
  20. c++;
  21. }
  22. i++;
  23. }
  24. return c;
  25. }
  26. int tree(int *q,int l,int r,int i,int a,int b){
  27. int m=0;
  28. if(l==a && b==r){
  29. return q[i];
  30. }
  31. else{
  32. m=(a+b)/2;
  33. if(r<=m){
  34. return tree(q,l,r,(2*i+1),a,m);
  35. }
  36. else{
  37. if(l>m){
  38. return tree(q,l,r,(2*i+2),m+1,b);
  39. }
  40. else{
  41. return (tree(q,m+1,r,2*i+2,m+1,b)+tree(q,l,m,(2*i+1),a,m));
  42. }
  43. }
  44. }
  45. }
  46. void build(int *q,int i,int a,int b,int *r,int k){
  47. int m=0;
  48. if(a==b){
  49. r[i]=peak(a,b,q,k);
  50. }
  51. else{
  52. m=(a+b)/2;
  53. build(q,(2*i+1),a,m,r,k);
  54. build(q,2*i+2,m+1,b,r,k);
  55. r[i]=peak(a,b,q,k);
  56. }
  57. }
  58. void update(int j, int i, int a, int b, int *r, int *q, int k){
  59. int m=0;
  60. if(a==b){
  61. r[i]=peak(j,j,q,k);
  62. }
  63. else{
  64. m=(a+b)/2;
  65. if(j <= m){
  66. update(j,2*i+1,a,m,r,q,k);
  67. }
  68. else{
  69. update(j,2*i+2,m+1,b,r,q,k);
  70. }
  71. r[i]=r[2*i+1]+r[2*i+2];
  72. }
  73. }
  74. void up(int j, int n, int * r, int * q){
  75. update(j,0,0,n-1,r,q,n);
  76. if (j > 0){
  77. update(j-1,0,0,n-1,r,q,n);
  78. }
  79. if (j<n-1){
  80. update(j+1,0,0,n-1,r,q,n);
  81. }
  82. }
  83. int main(){
  84. int k;
  85. scanf("%d", &k);
  86. int *q=malloc(k*4);
  87. int *r=malloc(k*16);
  88. int i=0;
  89. for(i=0;i<k;i++){
  90. scanf("%d", &q[i]);
  91. }
  92. int z=0;
  93. scanf("%d", &z);
  94. char can[10];
  95. int x=0;
  96. int y=0;
  97. build(q,0,0,k-1,r,k);
  98. for(i=0;i<z;i++){
  99. scanf("%s%d%d", can, &x, &y);
  100. if(strcmp(can,"PEAK")==0){
  101. printf("%d \n", tree(r,x,y,0,0,(k-1)));
  102. }
  103. else{
  104. q[x] = y;
  105. up(x, k, r, q);
  106. }
  107. }
  108. free(q);
  109. free(r);
  110. return 0;
  111. }
  112. #include <stdio.h>
  113. #include <stdlib.h>
  114. #include <math.h>
  115. #include <string.h>
  116. int query(int *T, int i){
  117. int v=0;
  118. while(i>=0){
  119. v=v^T[i];
  120. i=(i&(i+1))-1;
  121. }
  122. return v;
  123. }
  124. int fenwik(int *T, int l , int r){
  125. return query(T,r)^query(T,l-1);
  126. }
  127. void update (int i, int d , int *T, int n){
  128. while(i<n){
  129. T[i]=T[i]^d;
  130. i=i|(i+1);
  131. }
  132. }
  133. int min(int a, int b){
  134. if(a<b)return a;
  135. return b;
  136. }
  137. int build(char *hd, int l, int r,int *T, int n){
  138. int sum=0;
  139. int m;
  140. int bound=min(r,n);
  141. while(l<bound){
  142. m=(l+r)/2;
  143. sum=sum^build(hd,l,m,T,n);
  144. l=m+1;
  145. }
  146. if(r<n){
  147. sum=sum^(1 << (hd[r] - 97));
  148. T[r]=sum;
  149. }
  150. return sum;
  151. }
  152. int u(int x){
  153. x--;
  154. x |= x >> 1;
  155. x |= x >> 2;
  156. x |= x >> 4;
  157. x |= x >> 8;
  158. x |= x >> 16;
  159. return x+1;
  160.  
  161. }
  162. int tok(int x){
  163. if((x&(x-1))==0)return 1;
  164. return 0;
  165. }
  166.  
  167.  
  168. int main() {
  169. char *s= malloc(sizeof(char)*2000000);
  170. gets(s);
  171. int n=strlen(s);
  172. int *T=malloc(sizeof(int)*n);
  173. int g;
  174. g=u(n);
  175. build(s,0,g-1,T,n);
  176. int k;
  177. scanf("%d ", &k);
  178. while(k!=0){
  179. char c[4];
  180. scanf("%s ", c);
  181. if(c[0]=='H'){
  182. int x,y;
  183. scanf("%d %d", &x ,&y);
  184. if(tok(fenwik(T,x,y))==1)printf("YES\n");
  185. else printf("NO\n");
  186. }
  187. else{
  188. int delta=0;
  189. int P;
  190. char * stro=(char*)malloc(1000001*sizeof(char));
  191. scanf("%d ",&P);
  192. gets(stro);
  193. int len=strlen(stro);
  194. delta=delta^(1<<(s[P]-97));
  195. for (int i=0;i<len;i++) {
  196. delta=(1<<(stro[i]-97))^(1<<(s[P]-97));
  197. update(P,delta,T,n);
  198. s[P]=stro[i];
  199. P++;
  200. }
  201. free(stro);
  202. }
  203. k--;
  204. }
  205. free (s);
  206. free(T);
  207.  
  208. return 0;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement