Advertisement
Maruf_Hasan

FrequentValues_SPOJ

Apr 1st, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.64 KB | None | 0 0
  1.  
  2.  
  3. //In the Name of Allah Most Gracious, Most Merciful//
  4. /*If you want something you've never had, you have to do something you never did.*/
  5.  
  6. #include<bits/stdc++.h>
  7. using namespace std;
  8.  
  9.  
  10. #define pb push_back
  11. #define ll long long
  12. #define pii pair<int,int>
  13. #define pll pair<ll,ll>
  14. #define M 100007
  15. #define INF 1e9
  16. #define INFL 1e18
  17. #define PI acos(-1)
  18. #define mp make_pair
  19. #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  20. //const int fx[]= {+1,-1,+0,+0};
  21. //const int fy[]= {+0,+0,+1,-1};
  22. //const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
  23. //const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
  24. //const int fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
  25. //const int fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
  26. int arr[100100];
  27.  
  28. struct data
  29. {
  30. int leftval;
  31. int leftfreq;
  32. int rightval;
  33. int rightfreq;
  34. int maxval;
  35. int maxfreq;
  36. }tree[4*100010];
  37.  
  38.  
  39.  
  40. data combine(data d1,data d2)
  41. {
  42. if(d1.leftval==d2.rightval)
  43. {
  44. data ans;
  45. ans.leftval=d1.leftval;
  46. ans.leftfreq=d1.maxfreq+d2.maxfreq;
  47. ans.rightfreq=d1.maxfreq+d2.maxfreq;
  48. ans.rightval=d2.rightval;
  49. ans.maxfreq=d1.maxfreq+d2.maxfreq;
  50. ans.maxval=d1.leftval;
  51. // cout<<ans.maxval<<" "<<ans.maxfreq<<endl;
  52. return ans;
  53. }
  54. else if(d1.leftval==d2.leftval)
  55. {
  56. data ans;
  57. ans.leftval=d1.leftval;
  58. ans.leftfreq=d1.leftfreq+d2.leftfreq;
  59. ans.rightfreq=d2.rightfreq;
  60. ans.rightval=d2.rightval;
  61. if(d1.leftfreq+d2.leftfreq>=d2.rightfreq && d1.leftfreq+d2.leftfreq>=d2.maxfreq)
  62. {
  63. ans.maxfreq=d1.leftfreq+d2.leftfreq;
  64. ans.maxval=d1.leftval;
  65. }
  66. else if(d2.rightfreq>=d2.maxfreq)
  67. {
  68. ans.maxfreq=d2.rightfreq;
  69. ans.maxval=d2.rightval;
  70. }
  71. else
  72. {
  73. ans.maxfreq=d2.maxfreq;
  74. ans.maxval=d2.maxval;
  75. }
  76.  
  77. return ans;
  78. }
  79.  
  80. else if(d1.rightval==d2.rightval)
  81. {
  82. data ans;
  83. ans.leftval=d1.leftval;
  84. ans.leftfreq=d1.leftfreq;
  85. ans.rightfreq=d1.rightfreq+d2.maxfreq;
  86. ans.rightval=d2.rightval;
  87. if(d2.maxfreq+d1.rightfreq>=d1.leftfreq && d2.maxfreq+d1.rightfreq>=d1.maxfreq)
  88. {
  89. ans.maxfreq=d2.maxfreq+d1.rightfreq;
  90. ans.maxval=d2.rightval;
  91. }
  92. else if(d1.leftfreq>=d1.maxfreq)
  93. {
  94. ans.maxfreq=d1.leftfreq;
  95. ans.maxval=d1.leftval;
  96. }
  97. else
  98. {
  99. ans.maxfreq=d1.maxfreq;
  100. ans.maxval=d1.maxval;
  101. }
  102.  
  103. return ans;
  104. }
  105.  
  106. else if(d1.rightval==d2.leftval)
  107. {
  108. data ans;
  109. ans.leftval=d1.leftval;
  110. ans.leftfreq=d1.leftfreq;
  111. ans.rightfreq=d2.rightfreq;
  112. ans.rightval=d2.rightval;
  113. if(d2.leftfreq+d1.rightfreq>=d1.maxfreq && d2.leftfreq+d1.rightfreq>=d2.maxfreq)
  114. {
  115. ans.maxfreq=d2.leftfreq+d1.rightfreq;
  116. ans.maxval=d2.leftval;
  117. }
  118. else if(d1.maxfreq>=d2.maxfreq)
  119. {
  120. ans.maxfreq=d1.maxfreq;
  121. ans.maxval=d1.maxval;
  122. }
  123. else
  124. {
  125. ans.maxfreq=d2.maxfreq;
  126. ans.maxval=d2.maxval;
  127. }
  128. return ans;
  129. }
  130.  
  131.  
  132. else
  133. {
  134. data ans;
  135. ans.leftval=d1.leftval;
  136. ans.leftfreq=d1.leftfreq;
  137. ans.rightfreq=d2.rightfreq;
  138. ans.rightval=d2.rightval;
  139. if(d1.maxfreq>=d2.maxfreq)
  140. {
  141. ans.maxfreq=d1.maxfreq;
  142. ans.maxval=d1.maxval;
  143. }
  144. else
  145. {
  146. ans.maxfreq=d2.maxfreq;
  147. ans.maxval=d2.maxval;
  148. }
  149. return ans;
  150. }
  151. }
  152. void build(int node,int b,int e)
  153. {
  154. if(b==e)
  155. {
  156. // cout<<arr[b]<<endl;
  157. data d;
  158. // cout<<node<<" "<<arr[b]<<endl;
  159. d.leftfreq=1;
  160. d.leftval=arr[b];
  161. d.rightfreq=1;
  162. d.rightval=arr[b];
  163. d.maxfreq=1;
  164. d.maxval=arr[b];
  165. tree[node]=d;
  166. return;
  167. }
  168. int left=node*2;
  169. int right=node*2+1;
  170. int mid=(b+e)/2;
  171. build(left,b,mid);
  172. build(right,mid+1,e);
  173. tree[node]=combine(tree[left],tree[right]);
  174. }
  175.  
  176.  
  177.  
  178. data query(int node,int b,int e,int i,int j)
  179. {
  180. if(i>e || j<b)
  181. {
  182. data zero;
  183. zero.maxfreq=0;
  184. zero.leftfreq=0;
  185. zero.leftval=INF;
  186. zero.maxval=INF;
  187. zero.rightval=INF;
  188. zero.rightfreq=0;
  189. return zero;
  190. }
  191. if(b>=i & e<=j)
  192. {
  193. return tree[node];
  194. }
  195. int left=node*2;
  196. int right=node*2+1;
  197. int mid=(b+e)/2;
  198. data q1=query(left,b,mid,i,j);
  199. data q2=query(right,mid+1,e,i,j);
  200. data q=combine(q1,q2);
  201. return q;
  202. }
  203. int main()
  204. {
  205. fast_in_out;
  206. //freopen("input.txt","r",stdin);
  207. //freopen("output.txt","w",stdout);
  208. int n,q;
  209. while(true)
  210. {
  211. cin>>n;
  212. if(n==0)
  213. {
  214. break;
  215. }
  216. cin>>q;
  217. for(int i=1;i<=n;i++)
  218. {
  219. cin>>arr[i];
  220. }
  221. build(1,1,n);
  222. // for(int i=20;i>=1;i--)
  223. // {
  224. // cout<<i<<" "<<tree[i].maxval<<endl;
  225. // }
  226. // cout<<tree[1].maxfreq<<endl;
  227. while(q--)
  228. {
  229. int x,y;
  230. cin>>x>>y;
  231. data ans=query(1,1,n,x,y);
  232. cout<<ans.maxfreq<<endl;
  233. }
  234. data zero;
  235. zero.maxfreq=0;
  236. zero.leftfreq=0;
  237. zero.leftval=INF;
  238. zero.maxval=INF;
  239. zero.rightval=INF;
  240. zero.rightfreq=0;
  241. for(int i=0;i<400000;i++)
  242. {
  243. if(i<=100000)
  244. {
  245. arr[i]=0;
  246. }
  247. tree[i]=zero;
  248. }
  249.  
  250.  
  251. }
  252. return 0;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement