Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7.  
  8. vector<int> N;
  9. vector<long long> sec_sum;
  10. vector<long long> sec_max;
  11. vector<int> sec_inc;
  12. vector<int> sec_dec;
  13. int nn;
  14. int notperfect;
  15. void setupsections(){
  16. sec_sum.resize(nn+notperfect);
  17. sec_max.resize(nn+notperfect);
  18. sec_inc.resize(nn+notperfect);
  19. sec_dec.resize(nn+notperfect);
  20. for (int i = 0; i < sec_sum.size(); ++i)
  21. {
  22. long long sum = 0;
  23. long long maxx = N[i*nn];
  24. int inc = true;
  25. int dec = true;
  26. for (int j = i*nn; j < (i+1)*nn; ++j)
  27. {
  28. sum += N[j];
  29. if (maxx<N[j])
  30. {
  31. maxx = N[j];
  32. }
  33. if (j != (i+1)*nn - 1){
  34. if (inc && N[j] > N[j+1])
  35. inc = false;
  36. if (dec && N[j] < N[j+1])
  37. dec = false;
  38. }
  39.  
  40. }
  41. sec_sum[i] = sum;
  42. sec_max[i] = maxx;
  43. sec_inc[i] = inc;
  44. sec_inc[i] = dec;
  45. int incc = inc;
  46. int decc = dec;
  47. // cout<<"i:" <<i<<" sum:" <<sum << " maxx:" <<maxx<< " inc:" <<incc << " dec:" << decc <<endl;
  48. }
  49. }
  50.  
  51.  
  52.  
  53. int main(){
  54. int n, m;
  55. cin>>n>>m;
  56. N.resize(n);
  57. nn = sqrt(n);
  58. notperfect = sqrt(n)*sqrt(n)!=n;
  59. for (int i = 0; i < n; ++i)
  60. {
  61. cin>>N[i];
  62. }
  63. setupsections();
  64. char s;
  65. int x, y;
  66. for (int mm = 0; mm < m; ++mm)
  67. {
  68. cin>>s>>x>>y;
  69. x--;
  70. y--;
  71. if (s=='S')
  72. {
  73. int secx = x/nn;
  74. int inx = x%nn;
  75.  
  76. int secy = y/nn;
  77. int iny = y%nn;
  78.  
  79. // for (int i = 0; i < nn + notperfect; ++i)
  80. // {
  81. // cout<<sec_sum[i]<<" ";
  82. // }
  83. // cout<<endl;
  84.  
  85. // cout<<inx<<" "<<secx<<" "<<iny<<" "<<secy<<" &&" <<endl;
  86. long long sum = 0;
  87. if (secx==secy){
  88. for (int i = inx; i <= iny; ++i)
  89. {
  90. sum += N[secx*nn+i];
  91. }
  92. }else{
  93.  
  94. for (int i = inx; i < nn; ++i)
  95. {
  96. sum += N[secx*nn+i];
  97. }
  98. // cout<<sum<<endl;
  99. for (int i = secx+1; i < secy; ++i)
  100. {
  101. sum += sec_sum[i];
  102. }
  103. // cout<<sum<<endl;
  104. for (int i = 0; i <= iny; ++i)
  105. {
  106. sum += N[secy*nn + i];
  107. }
  108. }
  109. cout<<sum<<endl;
  110.  
  111. }else if (s=='M'){
  112. int secx = x/nn;
  113. int inx = x%nn;
  114.  
  115. int secy = y/nn;
  116. int iny = y%nn;
  117.  
  118. int maxx = N[x];
  119. if (secx==secy){
  120. for (int i = inx; i <= iny; ++i)
  121. {
  122. if (maxx<N[secx*nn+i])
  123. maxx = N[secx*nn+i];
  124. }
  125. }else{
  126.  
  127. for (int i = inx; i < nn; ++i)
  128. {
  129. if (maxx<N[secx*nn+i])
  130. maxx = N[secx*nn+i];
  131. }
  132.  
  133. for (int i = secx+1; i < secy; ++i)
  134. {
  135. if (maxx<sec_max[i])
  136. maxx = sec_max[i];
  137. }
  138.  
  139. for (int i = 0; i <= iny; ++i)
  140. {
  141. if (maxx<N[secy*nn+i])
  142. maxx = N[secy*nn + i];
  143. }
  144. }
  145. cout<<maxx<<endl;
  146.  
  147. }else if (s=='I'){
  148. int secx = x/nn;
  149. int inx = x%nn;
  150.  
  151. int secy = y/nn;
  152. int iny = y%nn;
  153.  
  154. int incc = 1;
  155. if (secx==secy){
  156. for (int i = inx; i <= iny; ++i)
  157. {
  158. if (N[secx*nn+i]>N[secx*nn+i+1]){
  159. incc = 0;
  160. break;
  161. }
  162. }
  163. }else{
  164.  
  165. for (int i = inx; i < nn-1; ++i)
  166. {
  167. if (N[secx*nn+i]>N[secx*nn+i+1]){
  168. incc = 0;
  169. break;
  170. }
  171. }
  172.  
  173. for (int i = secx+1; i < secy && incc; ++i)
  174. {
  175. if (sec_inc[i]==0){
  176. incc= 0;
  177. break;
  178. }
  179.  
  180. }
  181.  
  182. for (int i = 0; i < iny && incc; ++i)
  183. {
  184. if (N[secy*nn+i] > N[secy*nn+i+1]){
  185. incc = 0;
  186. break;
  187. }
  188. }
  189. }
  190. cout<<incc<<endl;
  191.  
  192. }else if (s=='D'){
  193. int secx = x/nn;
  194. int inx = x%nn;
  195.  
  196. int secy = y/nn;
  197. int iny = y%nn;
  198.  
  199. int decc = 1;
  200. if (secx==secy){
  201. for (int i = inx; i <= iny; ++i)
  202. {
  203. if (N[secx*nn+i]<N[secx*nn+i+1]){
  204. decc = 0;
  205. break;
  206. }
  207. }
  208. }
  209. else{
  210.  
  211. for (int i = inx; i < nn-1; ++i)
  212. {
  213. if (N[secx*nn+i]<N[secx*nn+i+1]){
  214. decc = 0;
  215. break;
  216. }
  217. }
  218.  
  219. for (int i = secx+1; i < secy && decc; ++i)
  220. {
  221. if (sec_inc[i]==0){
  222. decc= 0;
  223. break;
  224. }
  225.  
  226. }
  227.  
  228. for (int i = 0; i < iny && decc; ++i)
  229. {
  230. if (N[secy*nn+i] < N[secy*nn+i+1]){
  231. decc = 0;
  232. break;
  233. }
  234. }
  235. }
  236. cout<<decc<<endl;
  237. }else{
  238. y++;
  239. int secx = x/nn;
  240. int inx = x%nn;
  241.  
  242. // cout<<sec_sum[secx]<<" "<<N[x]<<" "<<y<<" <---"<<endl;
  243. sec_sum[secx] = sec_sum[secx] - N[x] + y;
  244. N[x] = y;
  245.  
  246. // cout<<sec_sum[secx]<<" "<<N[x]<<" "<<y<<" <---"<<endl;
  247. if (sec_max[secx]<y)
  248. sec_max[secx] = y;
  249.  
  250. int incc = 1;
  251. for (int i = secx*nn; i < (secx+1)*nn - 1; ++i)
  252. {
  253. if (N[i]>N[i+1]){
  254. incc = 0;
  255. break;
  256. }
  257. }
  258. sec_inc[secx] = incc;
  259.  
  260. int decc = 1;
  261. for (int i = secx*nn; i < (secx+1)*nn - 1; ++i)
  262. {
  263. if (N[i]<N[i+1]){
  264. decc = 0;
  265. break;
  266. }
  267. }
  268. sec_dec[secx] = decc;
  269.  
  270.  
  271. }
  272. }
  273. return 0;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement