<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3418265334198879901</id><updated>2024-08-27T17:14:41.439+05:30</updated><category term="Programming"/><category term="Arrays"/><category term="Dynamic Programming"/><category term="Interview"/><category term="Tutorial"/><category term="Trees"/><category term="Online Test"/><category term="Bitwise"/><category term="Strings"/><category term="Game Theory"/><category term="Google"/><category term="Greedy"/><category term="Link List"/><category term="Puzzle"/><title type='text'>Coders Stop</title><subtitle type='html'>Programming Interview Questions.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-4992832032855273132</id><published>2015-06-28T12:57:00.000+05:30</published><updated>2015-06-28T22:50:41.751+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Count the number of subsequence divisible by 6</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;You are provided a string with only digits [0 - 9], your task is to count the number of subsequences of string divisible by 6.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;For e.g. The given string is 1234566&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;The subsequences divisible by 6 are 12, 24, 36, 6, 6, 66&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Hence the answer should be 6&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;
The most obvious approach which comes is to generate all the subsequences and do a divisibility check and return the count satisfying the condition.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;But it is too expensive and overall complexity is 2^n (where n is the size of the string)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;
Can we make it better?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Obviously the units places has to be even i.e among 2, 4, 6, 8, 0.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;So the questions boils down finding the number of subsequences divisible by 3 and units digits as even.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;So how can we find the number of subsequences divisible by 3?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Or when does the adding of a number at units place makes it divisible by 3 ?&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Lets assume you have a subsequence in hand&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;a(1) a(2) a(3) ... a(n) % 3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= &amp;nbsp; &amp;nbsp;x &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (0 &amp;lt;=x &amp;lt;= 2)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;so what if add another digit in front of it making it&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;a(1) a(2) a(3) ... a(n) a(n + 1) % 3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = &amp;nbsp; &amp;nbsp;y &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (0 &amp;lt;= y &amp;lt;= 2)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Now if you work out few examples we would get the following table&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;span id=&quot;docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f&quot;&gt;&lt;span id=&quot;docs-internal-guid-2efa0969-3908-47c4-9007-c8f56f7ee594&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; border: none; width: 624px;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;*&quot;&gt;&lt;/col&gt;&lt;col width=&quot;*&quot;&gt;&lt;/col&gt;&lt;col width=&quot;*&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;x&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;a(&lt;/span&gt;&lt;span style=&quot;font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;n+1)&lt;/span&gt;&lt;span style=&quot;font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;% 3 &lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;y&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0px;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;2&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f&quot;&gt;&lt;span id=&quot;docs-internal-guid-2efa0969-3908-47c4-9007-c8f56f7ee594&quot;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span id=&quot;docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f&quot;&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;So by looking at the following table we can easily work out the code&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#define MOD 1000000007

long long count(char * s) {
 long long len = strlen (s);
 long long ones = 0, twos = 0, threes = 0, ans = 0, t_ones, t_twos, t_threes, sum = 0;
 for (int  i = 0; i &amp;lt; len; i++) {
  int rm = (s[i] - &#39;0&#39;) % 3;
  switch (rm) {
   case 0:
    t_ones = (ones + ones) % MOD;
    t_twos = (twos + twos) % MOD;
    t_threes = (threes + threes) % MOD;
    sum = threes + 1;
    ones = t_ones, twos = t_twos, threes = t_threes;
    threes++;
    break;
   case 1:
    t_ones = (ones + threes) % MOD;
    t_twos = (twos + ones) % MOD;
    t_threes = (threes + twos) % MOD;
    sum = twos;
    ones = t_ones, twos = t_twos, threes = t_threes;
    ones++;
    break;
   case 2:
    t_ones = (ones + twos) % MOD;
    t_twos = (twos + threes) % MOD;
    t_threes = (threes + ones) % MOD;
    sum = ones;
    ones = t_ones, twos = t_twos, threes = t_threes;
    twos++;
    break;
  }
  if ((s[i] - &#39;0&#39;) % 2 == 0)
   ans = (ans + sum) % MOD;
 }
 return ans;
}

&lt;/pre&gt;
&lt;span style=&quot;font-family: Georgia, Times New Roman, serif;&quot;&gt;Overall complexity of the algorithm is O(n)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/4992832032855273132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2015/06/count-number-of-subsequence-divisible.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/4992832032855273132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/4992832032855273132'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2015/06/count-number-of-subsequence-divisible.html' title='Count the number of subsequence divisible by 6'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-6166249485945669138</id><published>2015-03-13T02:37:00.001+05:30</published><updated>2015-03-21T12:46:45.025+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Strings"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Searching words in a dictionary [Tries]</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Given a dictionary, on which the below operations are required&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;1. Update the dictionary&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;2. Find a word in a dictionary.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;What are the possible options?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;One of the most&amp;nbsp;intuitive&amp;nbsp;approach is to store the strings in a sorted manner.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Lets have a look at the complexity of the operations&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;If average length of the string in the dictionary is m and the number of entries in dictionary is n,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;To build the sorted set of entries is O(m * n * log n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;and the complexity to find a word will be O(m * &amp;nbsp;logn)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;For large number of queries the algorithm is pathetically slow.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;How can we improve this?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Can we have a deterministic algorithm, with the maximum complexity being dependent on the number of characters in the word and not on the number of entries.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Lets try to visualize how we search in the dictionary for a particular word.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Assuming the word to searched is &#39;program&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;We first search if the word exist p, then inside p if r exists and so on...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So irrespective of the thickness of the dictionary we just searched based on some predefined marking of the characters which helps to search in the order of the length of the string.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Can we use the same concept in the programming?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;If we build a tree of which each node has 26 child, each representing one of the characters, then we can uniquely identify each of the string starting from the root and following each of the characters.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;The below figure speaks more than the thousand words,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.stack.imgur.com/f9Q3u.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://i.stack.imgur.com/f9Q3u.jpg&quot; height=&quot;147&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Dont fall into the trap that only leaf nodes are the terminal nodes, infact each node can act as a terminal node.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So essentially the complexity to add a word or to query a word takes O(m), where m is the length of the string and is independent on the number of entries in the set!&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/6166249485945669138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2015/03/searching-words-in-dictionary-tries.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/6166249485945669138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/6166249485945669138'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2015/03/searching-words-in-dictionary-tries.html' title='Searching words in a dictionary [Tries]'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-2419160826909823984</id><published>2015-03-12T23:20:00.001+05:30</published><updated>2015-04-08T09:58:48.215+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Strings"/><title type='text'>[Flipkart Interview] Compress the string</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Given a string you are provided with the possible operations.&lt;br /&gt;We can group the adjacent substrings, for e.g ABCABCBC can be compressed as &lt;br /&gt;2ABC1BC or 1ABCA2BC&lt;br /&gt;&lt;br /&gt;Among all the possible options, task is to find the resultant string with the minimum length.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;In case if there are multiple solutions return the lexicographically smallest string.&lt;br /&gt;So for the above example the solution would be 2ABC1BC&lt;br /&gt;&lt;br /&gt;Another example would be&lt;br /&gt;FLFLAFLAFLAF&lt;br /&gt;Solution: 1FLF3LAF&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Approach:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One obvious approach is to find all the possible compressions of the string and then find the one with the minimum length. &lt;br /&gt;&lt;br /&gt;So how do you achieve this? We need to find the repetitive substrings in sequence and perform it recursively. Well it is an awful exponential algorithm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So how do we improve this ?&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/2419160826909823984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2015/03/compress-string.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2419160826909823984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2419160826909823984'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2015/03/compress-string.html' title='[Flipkart Interview] Compress the string'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-3029197703683057475</id><published>2014-03-02T20:48:00.000+05:30</published><updated>2015-03-21T14:08:22.376+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Find the pivot element in the rotated sorted array</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;&quot;&gt;A sorted array is rotated around a pivot element.&amp;nbsp;Find the pivot element in the rotated sorted array.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;, sans-serif;&quot;&gt;&lt;b&gt;Analysis&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Lets start with an example&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Original array:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2, 4, 6, 8, 9, 10, 12, 15&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Rotated array:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10, 12, 15, 2, 4, 6, 8, 9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Output: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;One important observation is that the pivot element lies between two elements i, j iff i &amp;gt; j and a[i]&amp;nbsp; &amp;lt; a[j]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The ith element is the pivot element iff a[i-1] &amp;gt; a[i] &amp;lt; a[i+1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;With the above two observations we can modify the basic binary search technique to find the pivot element&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Below piece of code returns the pivot element&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int pivot(int * a, int len) {
    int l = 0, r = len - 1;
    if(a[l] &amp;lt; a[r])
        return 0;
    while (true) {
        if(l == r) return l;
        int m = (l + r)/2;
        if(a[m] &amp;lt; a[m-1] &amp;amp;&amp;amp; a[m] &amp;lt; a[m+1])
            return m;
        if (a[m] &amp;gt; a[r])
            l = m + 1;
        else r = m;
    }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/3029197703683057475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2014/03/find-pivot-element-in-rotated-sorted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3029197703683057475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3029197703683057475'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2014/03/find-pivot-element-in-rotated-sorted.html' title='Find the pivot element in the rotated sorted array'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-7158494428953790919</id><published>2014-02-23T00:34:00.000+05:30</published><updated>2015-03-21T12:56:47.038+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Remove the duplicate elements in the string</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given a string, inplace remove the duplicate elements form the string.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;For e.g. the given string is &quot;codersstop is&amp;nbsp; a programming blog&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Result: &quot;coderstp iagmnbl&quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Approach:&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Maintain a lookup table of the 256 entries to mark the occurrence of each of the characters, and only copy the elements which are occurring for the first time.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Below snippet of code removes the duplicate elements from the string &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;void removeDuplicate(char * s) {
    char a[256] = {0}, c = 0;
    int len = strlen(s);
    for(int i = 0; i &amp;lt; len; i++) {
        if(a[s[i]] == 0) s[c++] = s[i];
        a[s[i]] = 1;
    }
    s[c] = &#39;\0&#39;;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Overall time complexity is O(n) and space complexity O(1)&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/7158494428953790919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2014/02/remove-duplicate-elements-in-string.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7158494428953790919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7158494428953790919'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2014/02/remove-duplicate-elements-in-string.html' title='Remove the duplicate elements in the string'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-3505387474783765484</id><published>2014-02-03T00:37:00.005+05:30</published><updated>2015-03-21T12:58:05.411+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><title type='text'>Minimum distance between the two nodes of tree</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Given a binary tree(not BST) and two nodes in the tree(not necessarily leaf nodes), find the minimum distance between them.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;b&gt;Approach:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The minimum distance can be computed by first finding the LCA of the two nodes, and then finding the heights of the all the three nodes(2 nodes + 1 LCA) from the root.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;(For finding the LCA in the binary tree refer to the &lt;a href=&quot;http://coders-stop.blogspot.in/2013/10/lca-for-binary-tree.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;and finding the height of the element in the binary tree is self explanatory.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Then the total distance can be computed as&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&amp;nbsp;height(root, p) + height(root, q) - 2 * height (root, r) + 1; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int lca(struct tree * root, struct tree * p, struct tree * q, struct tree  *&amp;amp; res) {
    if(root == NULL || res != NULL)
        return 0;
    int found = 0;
    if(root == p || root == q)
        found = 1;
    found += lca(root-&amp;gt;left, p, q, res);
    found += lca(root-&amp;gt;right, p, q, res);
    if(res == NULL &amp;amp;&amp;amp; found == 2)
        res = root;
    return found;
}

int height(struct tree * root, struct tree * p) {
    if (root == NULL)
        return -1;
    if(root == p)
        return 0;
    int r = max(height(root-&amp;gt;left, p), height(root-&amp;gt;right, p));
    return r &amp;gt;= 0 ? r + 1 : r;    
}

int minDist(struct tree * root, struct tree * p, struct tree * q) {
    struct tree * r = NULL;
    lca(root, p, q, r);
    if(r == NULL)
        return -1;
    cout&amp;lt;&amp;lt; r-&amp;gt;data &amp;lt;&amp;lt; endl;
    return height(root, p) + height(root, q) - 2 * height (root, r) + 1;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/3505387474783765484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2014/02/minimum-distance-between-two-nodes-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3505387474783765484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3505387474783765484'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2014/02/minimum-distance-between-two-nodes-of.html' title='Minimum distance between the two nodes of tree'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-2058119492121824911</id><published>2013-10-19T21:37:00.002+05:30</published><updated>2015-03-21T12:58:51.668+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>LCA for a binary tree</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Given a binary tree(not a binary search tree) find the LCA of the 2 given nodes.&lt;br /&gt;
&lt;br /&gt;
The lowest common ancestor(LCA) for the nodes u and &lt;i&gt;v&lt;/i&gt; is defined as the lowest node w in &lt;i&gt;tree&amp;nbsp;&lt;/i&gt; that has both u and v as the descendants (where a node can be a descendant of itself).&lt;br /&gt;
&lt;br /&gt;
Approach:&lt;br /&gt;
&lt;br /&gt;
Lets consider the below tree&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;160&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;320&quot; /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LCA of node 30, 5 is 100&lt;br /&gt;
LCA of node 15, 50 is 50&lt;br /&gt;
and so on &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
Its easy to visualize that the bottom up approach is the way to go.&lt;br /&gt;
Populate
 from the bottom to up the number of nodes matched with the target nodes and the first level to find both the nodes is the required LCA.&lt;br /&gt;
&lt;br /&gt;
The short code snippet which finds the LCA of the two nodes is given below&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int lca(struct tree * root, struct tree * p, struct tree * q, struct tree  *&amp;amp; res) {
    if(root == NULL || res != NULL)
        return 0;
    int found = 0;
    if(root == p || root == q)
        found = 1;
    found += lca(root-&amp;gt;left, p, q, res);
    found += lca(root-&amp;gt;right, p, q, res);
    if(res == NULL &amp;amp;&amp;amp; found == 2)
        res = root;
    return found;
}&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/2058119492121824911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/10/lca-for-binary-tree.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2058119492121824911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2058119492121824911'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/10/lca-for-binary-tree.html' title='LCA for a binary tree'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-7243924139869634764</id><published>2013-10-16T17:26:00.000+05:30</published><updated>2015-03-21T13:03:12.335+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>A closer look at Coin Change</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Coin change has been a very famous computing problem which can be easily solved by Dynamic programming.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So what is coin change ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;If we want to make change for &lt;span class=&quot;texhtml&quot; dir=&quot;ltr&quot;&gt;&lt;i&gt;N&lt;/i&gt;&lt;/span&gt; cents, and we have infinite supply of each of &lt;img alt=&quot;S = \{ S_1, S_2, \ldots, S_m \}&quot; class=&quot;tex&quot; src=&quot;http://www.algorithmist.com/images/math/8/c/9/8c90ea93b0ca92b38ac1657ec0a9daf6.png&quot; /&gt; valued coins, how many ways can we make the change?  (The order does not matter.)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;For example, for &lt;span class=&quot;texhtml&quot; dir=&quot;ltr&quot;&gt;&lt;i&gt;N&lt;/i&gt; = 4,&lt;i&gt;S&lt;/i&gt; = {1,2,3}&lt;/span&gt;, there are 7 possible solutions: &lt;span class=&quot;texhtml&quot; dir=&quot;ltr&quot;&gt;{1,1,1,1},{1,1,2}, {1, 2, 1}, {2, 1, 1}, {2,2},{1,3}, {3, 1}&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So how to compute the number of ways efficiently?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Lets assume you know the number of ways to generate the sum 1, 2, 3 , can you find the number of&amp;nbsp; ways to generate 4?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Yes, you can, indeed you have just broken the problem into the subproblems, a basic paradigm of the dynamic programming.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Let assume F(n) denotes the number of solutions possible.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So F(4) = F(3) + F(2) + F(1)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;In general if S[i] denotes the denominations of the coins then&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;58&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;320&quot; /&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The below piece of code generates the number of combinations for a particular sum.&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int coin_change_infinite(int s[], int n, int val) {
    int * a = (int *) calloc(1, sizeof(int) * (val + 1));
    int res;
    sort(s, s + n);
    a[0] = 1;
    for(int i = 1; i &amp;lt;= val; i++)
         for(int j = 0; s[j] &amp;lt;= i &amp;amp;&amp;amp; j &amp;lt; n; j++)
                 a[i] += a[i - s[j]];
    res = a[val];
    free(a);
    return res;
}&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Overall running time for the algorithm is O(n*c) (n is the value for which the denominations needs to be made and c is the types of denominations available.) and space complexity is O(n)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/7243924139869634764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/10/a-closer-look-at-coin-change.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7243924139869634764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7243924139869634764'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/10/a-closer-look-at-coin-change.html' title='A closer look at Coin Change'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-2815661243120921709</id><published>2013-07-05T01:10:00.003+05:30</published><updated>2015-03-21T13:09:36.365+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Largest area in a Histogram</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Find the maximum area of a rectangle that fits entirely in 
the Histogram.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;For e.g in the below histogram the maximum area of the rectangle is 2 * 80&amp;nbsp; = 160&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3418265334198879901&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3418265334198879901&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3418265334198879901&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3418265334198879901&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJCv1Mij8LYSHeCosLK1vUhNujzkLykLVPogia_qVr5kRwUz0zOMgYTs6Hj-TR0_1rakMAjuUyChix7LHYG6QeFHb_vX-vQJBIJGrPKgJ9Pj1DSAc1_GAZhd8knLAPkE65HTK_ZznxK2g/s285/pic.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJCv1Mij8LYSHeCosLK1vUhNujzkLykLVPogia_qVr5kRwUz0zOMgYTs6Hj-TR0_1rakMAjuUyChix7LHYG6QeFHb_vX-vQJBIJGrPKgJ9Pj1DSAc1_GAZhd8knLAPkE65HTK_ZznxK2g/s285/pic.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The length of each bar will be the input, and the width of each bar is same, 1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Approach:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The naive approach can be to select one histogram at a time, find the maximum area which can be formed with this, finally return the maximum value over all the histogram.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Time Complexity O(n^2), Space Complexity O(1)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Can we do better. Lets have a look if we are computing some of the results over and over or if any of the computations are unnecessary.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Some of the key observations are:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;The area of the&amp;nbsp;&lt;/span&gt;neighbouring&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;groups is equal to&amp;nbsp;(min height of the bar in group * width of the group)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;This means that we need to calculate the area formed by each minimum bar encountered so far, calculating the max of all such areas will give us the desired result.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So if we have the bars in the order given as&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;9, 4, 10, 12, 16, 14, 8, 5, 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;So we need to calculate the area at the points, 4, 14, 8, 5, 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;for the ith bar which has the height h &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;max area = (h)*(number of&amp;nbsp;&lt;/span&gt;contiguous&lt;span style=&quot;font-family: inherit;&quot;&gt;&amp;nbsp;bar to the left and right which has height &amp;lt;= h)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;and the max of this is 8*5 = 40 (which is the max area of the rectangle completely inside the histogram)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;So what is the data structure we can employ,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Stack seems to be an obvious choice since we are always concerned with the element just pushed(which is the top of the stack)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Below is the piece of code which calculates the max area&lt;/span&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int maxArea(int a[], int n ) {
    stack&lt;int&gt;&amp;lt;int&amp;gt; s;
    int max = 0;
    for(int i = 0; i &amp;lt; n;i++) {
        while(!s.empty() &amp;amp;&amp;amp; (a[i] &amp;lt;= a[s.top()])) {
            int h = s.top();
            s.pop();
            int l = s.empty() ? 0 : s.top() + 1;
            int m = (i - l) * a[h];
            if(m &amp;gt; max) max = m;
        }
        s.push(i);
    }
    while(!s.empty()) {
        int h = s.top();
        s.pop();
        int l = s.empty() ? 0 : s.top() + 1;
        int m = (n - l) * a[h];
        if(m &amp;gt; max) max = m;
    }
    return max;
}&lt;/int&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Since every bar is inserted and removed only once, time complexity O(n).&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/2815661243120921709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/07/largest-area-in-histogram.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2815661243120921709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2815661243120921709'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/07/largest-area-in-histogram.html' title='Largest area in a Histogram'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJCv1Mij8LYSHeCosLK1vUhNujzkLykLVPogia_qVr5kRwUz0zOMgYTs6Hj-TR0_1rakMAjuUyChix7LHYG6QeFHb_vX-vQJBIJGrPKgJ9Pj1DSAc1_GAZhd8knLAPkE65HTK_ZznxK2g/s72-c/pic.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-3538298616230224702</id><published>2013-06-02T17:36:00.001+05:30</published><updated>2015-03-21T13:10:44.357+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>[Amazon Online test] Sort an array containing 0, 1 &amp; 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Given that an array consists of only 0s 1s and 2s sort the array in one pass.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Approach:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Lets view the problem if the constraint of one pass wouldn&#39;t have been there&lt;br /&gt;
Scan over the array and count the number of 0, 1, and 2.&lt;br /&gt;
Now initialise the array with the 0, 1, 2 with the number of elements, the idea is similar to the counting sort.&lt;br /&gt;
&lt;br /&gt;
To solve the above problem in one pass we can use the famous Dutch national flag algorithm.&lt;br /&gt;
The basic idea is to traverse over the array and keep track of the current 0s and 2s and the read pointers(initialised with -1, n and 0). Now traverse the array and keep swapping the current element in the respective buckets of interest.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
The implementation is given by&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;void sort(int a[], int n)
{
   int zero = -1;
   int two = n;
   int current = 0;
 
   while(current &amp;lt; two) {
      switch(a[current]) {
         case 0:
           swap(&amp;amp;a[zero++], &amp;amp;a[current++]);
           break;
         case 1:
           current++;
           break;
         case 2:
           swap(&amp;amp;a[current], &amp;amp;a[two--]);
           break;
      }
   }
}
&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/3538298616230224702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/06/sort-array-containing-0-1-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3538298616230224702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3538298616230224702'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/06/sort-array-containing-0-1-2.html' title='[Amazon Online test] Sort an array containing 0, 1 &amp; 2'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-8622479060383019626</id><published>2013-06-02T10:29:00.001+05:30</published><updated>2015-03-21T13:12:25.613+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Link List"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>[Expedia Interview] Intersection of two link list</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Given two link lists intersecting in the following manner &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAACGCAIAAACkKe+jAAAEaUlEQVR4nO3dy3KjWBRFQf7/p1UDOxRlG/G8wHlkTtutloC94gaTnl4AlDM9/QUAGE/cAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2goNBxn6ZpmkJ/Q4CY4qZz+unprwOQSehoTnOe/lIACURv5WzfJR5gWZpKSjzAdsn6KPEAW6Qso3c1AMtyB1HiAWZVSKHEA/xSJ4Le1QC8VWufxAO86sX9TeL5xTNAK8WfdQd5vrj7dNPiQZf4ztx3eur1oEt8K+41nXV83B3ky3Nzoe9DL/FVuafw6hz3N4kvw32EN0//N4lPzb2DX2zgB+9q0nGzYJYlzJP4FNwj+MQYlkh8WO4LLDOJdd7VhOJGwBaGsZXER+Diw0bmsZvEP8I1h10s5CAH+du4yHCAnZwi8ZdyYeEwaxlD4odzPeEMgxlJ4odwDeE8sxnPu5rDXDQYxXguJPHbuVAwlgldTuJXuT4wnBXdxLuaWS4IXMSWbiXxby4CXMqintE58W1/ONzJrp7U8CDf6sfCg0zreU0SX/4HQigGFkjVxJf8URCcmYVTLPFlfgjkYmxBFXhXk/rLQ3b2Fl3GxKf7wlCP1eWQJfEpviR0YHuZBH9XE/aLQUPml0/AxIf6MsBL3FMbm/hjnybrEJMppnfyIP/pX1/9NFmHyAyyiGOJ31j2v5+m7BCcTVYz9ty9q/hAHJZZ065z97FPk3WIzD4rG3jolnXIxUpbOFN2x3bIyEQb2dvo2T8Wd0jBRHvZ+Ipm4Z86vEMK9tnI7AF84Wz+KeLiDvHZZyMbD+mrZ3Nxh/jss5GFKIs7FGOfjRw4uXstA0nZZyN/o/yp48uJF3eIzz572X48X/5jcYfg7LOXA41WdsjIRBs5GWiJh0SMs4vzafZ+BhIxy/oWorwxzX//XuUhOGusbCG+G7u8+mcSDzHZYVmrwf10+l6w8b8l8fA4CyxoV2dPZn3LRw36WcAOhlfK4bCezPqWj9r7OcAZJldEwJhKPDzI2CqI3FAHeXiEjeWWJZoSDzezrqyShlLi4R52lU+BOEo8XM2ikqnURO9q4DqGlEbhCEo8DGdCCTQJn8TDQMYTWsPYeVcDQ9hMXJ0DJ/FwkrVEJGpvEg/H2EksQjbLQR72Mo9AlGuZxMN2hhGCYO0i8bDKJB4mUodJPCwwhscI0xDe1cAsG3iGGA0n8fA/T//dBOhSEg9fPPf3EZ3beFcDHvc7qMwj9J3OPOuX05fHuf405EG/kKyH4hbQimf9ErIOPEt0BpN1IALpGUnZgSDUZwxZB0LRoLNkHQhIiU5RdiAmMTpI1oHIJGk3WQfiE6YdZB3IQp62UnYgEYVaJ+tAOjq1RNaBpNRqnqwDqWnWDGUHspOtH2QdqEG8vsk6UImEvV7+Tz1AOd1D5sAOlNS3ZbIOFNa0aLIO1Naxa8oOlNc0bbIO1CZwAAWJO0BB/wDNbAcIrQKCIQAAAABJRU5ErkJggg==&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&amp;nbsp;check whether the two list intersect or not, if it does find the point of intersection.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Approach:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;First gotcha in the problem is that such a linked list cannot exist. Since it is a singly linked list hence a node cannot have 2 next pointers.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So the problem reduces to the Y shaped linked list.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAC9CAIAAADKlBjNAAAFJ0lEQVR4nO3a2W3CQABFUddFQa6HatwMxTgfJGEJhG1sz7w55ytBQrLA72pCGGYA4gxbXwAA5Yk7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcV/DMAzD4KUG1qM4ZR32u2PJx+nnoeHSllcHdENrijrsd8Ow2+3O6z7csemFAuEkpqTDfjcM43Q8vp/O7vMs8cC6xKWgafxu+q26/1B5YAWaUs40DsOw2x/mn7off75J4oFFqUkxZ21/ou4/VB5YgoiUMo03Ev1E3ed5lnigNPko5OLcPs8vnN0vqDxQhGoUcavk3195v/1v1f9JPPAhvajXvcSrPPCQTDRA4oFXCUQzJB54njS0R+WBhxShVRIP/EMLmqfywF8SEELigXPGn0blgVncU0k8dM7ak91LvMpDPCPvgsRDb8y7IxIP/TDsHqk8xLPnfkk8BLNkVB4CGTDfJB6SmC7XVB4CWCy3STw0zVZ5QOWhRSbKUyQe2mKcvOBe4lUeamOTvEPioXLWyPskHqplhxSg8lAb86MYiYd6GB7lqTxszt5YisTDhiyNxak8rM/AWInEw5pMi1XdS7zKQ1kWxTYkHhZlS2ypZOKn8fT83f5Q+lKpzPn77T2/QdypwoeVP+x3wzAM4/T7q6mnm8azol/dAMziTlXeTfzxEGfZXbmI++wm+EPcqdFrlTfrHl3H/Xh49xfbL3GnXk8m3p/kXbqO+98HOifuNOBB5Z3ce+Tk/oC404y7iXd079HNz9y1/UTcac+9yp/yPo1Wns63ZR4Qd1p1N/F0wPfcHxJ3GrZNV6jA1rdeA7xGNGnrtrCxrW/ABniNaIypwzOsgmbIOjzPNmiArMOrLISqyTq8x06olKzDJ6yF6sg6fM5mqIisQymWQxVkHcqyHzYm67AEK2Izsg7LsSU2IOuwNItiVbIO67Ar1iPrsBrrYg2yDiuzMZYl67AJS2Mpsg4bsjfKk3XYnNVRkqxDJWyPMmQdqmKBfErWoUJ2yPtkHapljbxD1qFyNslrZB2aYJk8S9ahIfbJY7IOzbFS/iPr0Chb5TZZh6ZZLNdkHQLYLSeyDjGsl3mWdYhjw72TdYhkyf2SdQhmzz2SdYhn1X2RdeiEbffib9aVHYKZdz5Zhw4ZeTJZh26ZeiZZh84ZfBpZB2ZxTyLrwC/jTyDrwBUJaJusAzcJQatkHfiHHLRH1oGHRKElsg48SRraIOvASwSidrIOvEEm6iXrwNvEokayDnxIMuoi60ARwlELWQcKko/tyTpQnIgUMY0XZR6n554m68BCpKSIaRyGYbc/zPN82O9+f75P1oFFCUoRZ3H/PsXfPbzLOrACWSniz8n9VttlHViNuBRx9Zn7ddtlHViZxBRx/rHM8eh+6rusA+sTmiLO437xL1VZBzYhN0VcxP3il5++b3dtQI9Ep4gHn7kDrEzcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAn0BGenYoouJTKIAAAAASUVORK5CYII=&quot; /&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Now we observe that the pointer D is common to both the list and to find if the list intersect&amp;nbsp; or not it is sufficient to find if both the list have a common pointer among their start or end pointers.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Finding the point of intersection is now trivial and left to the reader. &lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/8622479060383019626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/06/expedia-interview-intersection-of-two.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8622479060383019626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8622479060383019626'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/06/expedia-interview-intersection-of-two.html' title='[Expedia Interview] Intersection of two link list'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-4826512358979884975</id><published>2013-06-01T12:23:00.001+05:30</published><updated>2015-03-21T13:13:19.714+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Cumulative Sums of elements in an array[Binary Indexed Tree]</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given a array and with below possible operations&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Update: Add a value to a index a&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Query: Get a cumulative sum from a range a to b&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;What is the data structure you would employ and what will be the time complexity of the update and query operations.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;Approach:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The basic idea of any of the algorithm is to store/update the sum of the subparts and compute the sum in a range by adding up the relevant subparts.So for e.g a common data structure Segment tree creates a tree where the parent stores the sum of the child elements.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;So each node in the tree takes care of the sum in a particular range.&lt;/span&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;321&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9AAAAPtCAIAAABZ8WNOAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAA/7JJREFUeF7s3Xm8T9X++PEf5xyHg2Oep6TMZChxlSai3EooJRJJSLlKSkq5KqVISYOxXCIlJRERMqRkiJB5zjweHMfB/b2/v3N/57vv2fvzOXv87Ol1//g9fl/tvdZ7PdfnrL0+78/aa/2ff/M/BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQsCzwfyyXQAEIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDwbxLufAgQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEELBBgIS7DYgUgQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAACXc+AwgggAACCCCAAAIIIIAAAggggAACCCCAAAII2CBAwt0GRIpAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQICEO58BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRsECDhbgMiRSCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggQMKdzwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAjYIkHC3AZEiEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBAg4c5nAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABGwRIuNuASBEIIIAAAggggAACCCCAAAIIIIAAAggggAACCJBw5zOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggIANAiTcbUCkCAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEESLjzGUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwAYBEu42IFIEAggggAACCCCAgH8F/o/B/3388cf+bayjkYuMQcv/A6ajPULhCCCAAAIIIIAAArEXIOEee3NqRAABBBBAAAEEEPCQgNM54quuukqzCu/kmpctW6YZ4R133GGon0i4G+LiYgQQQAABBBBAAIFACpBwD2S30igEEEAAAQQQQAABvQIOJdx79+6tp2RJx+sN1IHrIv0YkCVynb8NkHB3oIsoEgEEEEAAAQQQQMBnAiTcfdZhhIsAAggggAACCCBgr4CetLjyGj3ZZyfKtLfVOn8PUDYk2wBIuGdLxAUIIIAAAggggAACgRcg4R74LqaBCCCAAAIIIIAAAtEEsiTHJRNtxSvS9izZpuAt1msoZp0L29UxS+sMVZTlYjWOnl8vrNTIvQgggAACCCCAAAIIxFiAhHuMwakOAQQQQAABBBBAwFsC9ibcs02sR7kgNtln09n2jMit5NxJuHvro080CCCAAAIIIIAAAg4IkHB3AJUiEUAAAQQQQAABBPwjYGPCXf/5qJGutJLO1kMu56DqPB81yp4zeirSvIaEu2k6bkQAAQQQQAABBBDwiwAJd7/0FHEigAACCCCAAAIIOCJgV8JdcwdzSXBHCtro9dYbr5lDj35qq+YPA1EaFT1IEu7WO5ESEEAAAQQQQAABBDwuQMLd4x1EeAgggAACCCCAAALOCtiVcFfnprNNTGvm3J1b5K5e255thEKvuSjeXJAk3J39KFM6AggggAACCCCAgAcESLh7oBMIAQEEEEAAAQQQQMA9AVsS7pqpcz1tUqez9STB9ZSc5RrN5e06yzGXqVcXTsJdJziXIYAAAggggAACCPhXgIS7f/uOyBFAAAEEEEAAAQRsELAl4a7Om0uCW09w6hy0xKPnRqPXqJPm+s9otWslPgl3o73G9QgggAACCCCAAAK+E3BkNu87BQJGAAEEEEAAAQQQCK2ALQl3dTpb/6Yr6r1o9KfCdfaa6QX4meWrg9T5i4IyQhLuOvuLyxBAAAEEEEAAAQT8K0DC3b99R+QIIIAAAggggAACNghYT7ir09nRTyLNErR6sxfbd5WxvnGNOkhDbcxoMgl3Gz6vFIEAAggggAACCCDgbQES7t7uH6JDAAEEEEAAAQQQcFjAesJdnYw2tPo7BrvKWF+frhmk/lX8JNwd/hRTPAIIIIAAAggggIBXBEi4e6UniAMBBBBAAAEEEEDAFQHrCXfre8JY2ZFGD5qVDdwzy7feTFa46+ksrkEAAQQQQAABBBDwtQAJd193H8EjgAACCCCAAAIIWBWwnnC3ni63nsuOomDL4nQp3/TBsJmxkXC3+mHlfgQQQAABBBBAAAHPC5Bw93wXESACCCCAAAIIIICAkwIWE+62pLOt57JjkHC3vtc8CXcnP8iUjQACCCCAAAIIIOAJARLunugGgkAAAQQQQAABBBBwS8Biwl19YqoUaLQt1g81dSXhbvTcVBLuRj8YXI8AAggggAACCCDgOwHDXwZ810ICRgABBBBAAAEEEEAgioDtCXejaWiJzfri8Rgk3NU/LRhtKQl3/hIRQAABBBBAAAEEAi9Awj3wXUwDEUAAAQQQQAABBKIJWEy4q3PlRtPQmgl3E4VEaqTmpjeSPTf6sbC+lp+Eu1FzrkcAAQQQQAABBBDwnQAJd991GQEjgAACCCCAAAII2CnghYS79Vx2dBH1sa7yO4FRROtBknA3as71CCCAAAIIIIAAAr4TIOHuuy4jYAQQQAABBBBAAAE7BSwm3NXbr5tYnG49lx1dRELK0kxXgiThbucHl7IQQAABBBBAAAEEPClAwt2T3UJQCCCAAAIIIIAAArESsD3hLil4o7E7nXBX73sjrZb0t6E4rQdJwt0QOBcjgAACCCCAAAII+FGAhLsfe42YEUAAAQQQQAABBGwTCEPCXXMbd6M/DJBwt+0zR0EIIIAAAggggAACwRUg4R7cvqVlCCCAAAIIIIAAAjoEwpBwFwb1rjLScEM7uas3z5ESdAD/7yWscDfExcUIIIAAAggggAACfhQwNkX2YwuJGQEEEEAAAQQQQACBKAKeTbgb3fIlei9rrk/XmXOPdC8Jd/6yEEAAAQQQQAABBBDIIkDCnY8EAggggAACCCCAQKgFQpJwlz7WXKKe0XzNpe6aG9EouYyevMoK91D/pdF4BBBAAAEEEEAgHAIk3MPRz7QSAQQQQAABBBBAIIKAZxPuTvRYlsZa/D9JuDvRR5SJAAIIIIAAAggg4GsBEu6+7j6CRwABBBBAAAEEELAqEKqEu2BZTLIrbzd67Cor3K1+WLkfAQQQQAABBBBAwPMCJNw930UEiAACCCCAAAIIIOCkQNgS7mIZZW+ZSOl42cZdtp2xaEXC3ckPMmUjgAACCCCAAAIIeEKAhLsnuoEgEEAAAQQQQAABBNwSsJhEVqehjW60Ig3XPJXUUZBs92fPZMnc3l2dppewDQVJwt0QFxcjgAACCCCAAAII+FGAhLsfe42YEUAAAQQQQAABBGwT8ELC3ZasvTkRddUZIOqfDdQJd0mgG6qUhLshLi5GAAEEEEAAAQQQ8KMACXc/9hoxI4AAAggggAACCNgmYDHhrl6cbmKFu4sJd/2O0q4sVvrvzbiShLtRMa5HAAEEEEAAAQQQ8J0ACXffdRkBI4AAAggggAACCNgpYDHhrrk3i9H41IvHjZ5HarRGE9dngTLxuwIJdxPs3IIAAggggAACCCDgLwES7v7qL6JFAAEEEEAAAQQQsFnAmwn3zJ3TbW6t2eLUC/lNREjC3Sw/9yGAAAIIIIAAAgj4RoCEu2+6ikARQAABBBBAAAEEnBCwmHCXkLKUIP+n0c3N1bu1GD2P1AkZZZnWN3CX0ki4O91NlI8AAggggAACCCDgugAJd9e7gAAQQAABBBBAAAEE3BSwnnBXJ6ONpsutp+ydFlRHaKJGEu4m0LgFAQQQQAABBBBAwF8CJNz91V9EiwACCCCAAAIIIGCzgPWEu/rIU0PbrdiyC7zNKP9dnC37yUiRJNwd7SYKRwABBBBAAAEEEPCCAAl3L/QCMSCAAAIIIIAAAgi4JmA94a7ORxs6UFSdr/faianqHW+M7pmT0bsk3F37lFMxAggggAACCCCAQKwESLjHSpp6EEAAAQQQQAABBDwpYD3hLs2ysieMOp1taIG806g2/h5Awt3pzqJ8BBBAAAEEEEAAAdcFSLi73gUEgAACCCCAAAIIIOCmgC0Jd/U27jqT5pr7yehZP66uMaMheu7Vz206PM0qSLjrl+dKBBBAAAEEEEAAAZ8KkHD3accRNgIIIIAAAggggIA9ArYk3NW7ykixeuJT58117iejXlMv/6LzXj2BZVyjrkXnDwkk3PUjcyUCCCCAAAIIIIBAkAR0fQ0IUoNpCwIIIIAAAggggAACSgFbEu5SoHpnmGzT35ppevnHbDtIc+G5vcvbNaswtDe9uhWscM+2Z7kAAQQQQAABBBBAwO8CJNz93oPEjwACCCCAAAIIIGBJwK6Eu2b2PErOXfN6nRlt9b7q0gqd9+rBcmi/GhLuevC5BgEEEEAAAQQQQMDXAiTcfd19BI8AAggggAACCCBgVcCuhLvEESlPrV60rl4Ob2gHds3b9S+Nj5Saj7Rw3lBsUfqDhLvVDyv3I4AAAggggAACCHhegIS757uIABFAAAEEEEAAAQScFLAx4S5ham6trvMf9W+Pri5Q5/L26Cn1KHHachYrCXcnP8iUjQACCCCAAAIIIOAJARLunugGgkAAAQQQQAABBBBwS8DehLvpjLb+bLvmXjQ6bzcXnl1dQ8LdLknKQQABBBBAAAEEEPCsAAl3z3YNgSGAAAIIIIAAAgjEQsDehHtGxDqXtGdepmc3mEwLzY1rdEoZTbjrzOObrt1Qw3XWwmUIIIAAAggggAACCLgoQMLdRXyqRgABBBBAAAEEEHBfwImEu7RK81xT01vBKJnUG7jrT4vrT7jrL1N/F7LCXb8VVyKAAAIIIIAAAgj4VICEu087jrARQAABBBBAAAEE7BFwKOGeGVyk81HNLe7WzJgb2mA9UjwZDuai0tkTJNx1QnEZAggggAACCCCAgH8FSLj7t++IHAEEEEAAAQQQQMAGAacT7jaEqChCvYG77DBjbxXOlUbC3TlbSkYAAQQQQAABBBDwiAAJd490BGEggAACCCCAAAIIuCPgr4S7egN3R9ek29slJNzt9aQ0BBBAAAEEEEAAAQ8KkHD3YKcQEgIIIIAAAggggEDsBPyVcM8SrewPEzspyzWRcLdMSAEIIIAAAggggAACXhcg4e71HiI+BBBAAAEEEEAAAUcFfJRw93vC2u/xO/o5pHAEEEAAAQQQQACBYAiQcA9GP9IKBBBAAAEEEEAAAZMCPkq49+7dO0u0Jtvs0m0k3F2Cp1oEEEAAAQQQQACB2AmQcI+dNTUhgAACCCCAAAIIeFDARwl32UBGGa3k3z3oGSUkEu7+6i+iRQABBBBAAAEEEDAhQMLdBBq3IIAAAggggAACCARHwEcJd18vb5dPDAn34PzZ0BIEEEAAAQQQQACBCAIk3PloIIAAAggggAACCIRaIEsWO9v/8+OPP3bFS+pVxnbHHXe4EkaUSrNEmK2kXOAWptfoiAcBBBBAAAEEEEAgMAIk3APTlTQEAQQQQAABBBBAwIyAnryw8hq3csSSYVeGIavFzbTWyXtIuDupS9kIIIAAAggggAAC/hAg4e6PfiJKBBBAAAEEEEAAAYcE/JJwV27gLv9/hzSsFEvC3Yoe9yKAAAIIIIAAAggEQ4CEezD6kVYggAACCCCAAAIImBTwS8LdZPNieBsJ9xhiUxUCCCCAAAIIIICARwVIuHu0YwgLAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAwF8CJNz91V9EiwACCCCAAAIIIICAOwKrV68+e/asO3VTKwIIIIAAAggggAACPhEg4e6TjiJMBBBAAAEEEEAAAQTcE7h8+XKdOnXy5cv3wgsvHD9+3L1AqBkBBBBAAAEEEEAAAU8LkHD3dPcQHAIIIIAAAggggAACXhCYNm1a5mb3BQsWHDx48OnTp70QGDEggAACCCCAAAIIIOApARLunuoOgkEAAQQQQAABBBBAwHMCFy9erFatWpbTZYsWLfr222+fO3fOc+ESEAIIIIAAAggggAAC7gmQcHfPnpoRQAABBBBAAAEEEPCDwKZNmxITE7Mk3DP+z9KlS48aNSotLc0P7SBGBBBAAAEEEEAAAQQcFyDh7jgxFSCAAAIIIIAAAgj4SGDx4sXt2rXr2bOnj2KOQajHjh17/vnn8+bNq5l2v+KKK8aPH5+enh6DSKgCAQQQQAABBBBAAAEvC5Bw93LvEBsCCCCAAAIIIIBAjARkR3JZqV2zZs2MhLJklk+cOBGjuv1TzcGDB3v37p07d27NtHvlypWnTJly6dIl/zSISBFAAAEEEEAAAQQQsFmAhLvNoBSHAAIIIIAAAggg4C+B9evXy3r2/PnzZ0kijxgxwl8NiVm0e/bs6datW0JCgmbavVatWl9//fXly5djFg8VIYAAAggggAACCCDgHQES7t7pCyJBAAEEEEAAAQQQiJ2AbDsuy7GbNGmimTWWf6xSpQpZ4yj9sW3bto4dO8bFxWkCXnfddXPnzo1dd1ITAggggAACCCCAAALeECDh7o1+IAoEEEAAAQQQQACBWAnIAu0XX3yxZMmSkVLtGdn2Dz/8kE3Js+2TDRs2tG3bNkeOHJqY8nuG7ImfbSFcgAACCCCAAAIIIIBAYARIuAemK2kIAggggAACCCCAQDQBWa4ua65btWoVaVG2pIxz5crVvn37JUuWQGlIYPXq1S1btoz0A0bz5s1//fVXQwVyMQIIIIAAAggggAACPhUg4e7TjiNsBBBAAAEEEEAAAb0Cx48fHz58+NVXXx1lSXuFChVee+21Q4cO6S2U61QCy5Ytu/XWWzWRZQm8/NSxbt062BBAAAEEEEAAAQQQCLYACfdg9y+tQwABBBBAAAEEQi2wcuXKLl26JCUlRUq158yZU9Zff/PNNxcvXgy1lH2NX7BgQaNGjTTBRfvBBx/cvHmzfbVREgIIIIAAAggggAAC3hIg4e6t/iAaBBBAAAEEEEAAAesC586d++STTxo0aBBlSXvhwoWfeeaZrVu3Wq+OEtQCs2bNqlu3rqZ/fHy8/Aqyc+dO3BBAAAEEEEAAAQQQCJ4ACffg9SktQgABBBBAAAEEwiuwbdu2vn37FilSJEqq/brrrpswYYIk5cPLFJOWy6b5X3zxRfXq1TX7QrbLf+KJJ/bv3x+TWKgEAQQQQAABBBBAAIEYCZBwjxE01SCAAAIIIIAAAgg4JyAbwsycObNFixayaUmkVHuePHk6d+4sm8w4FwYlqwWkayZOnFipUiXNfpFOkR9Ijhw5Ah0CCCCAAAIIIIAAAsEQIOEejH6kFQgggAACCCCAQEgF5JjT119/XY48jbKkXY5LHTZs2LFjx0Jq5IFmX7hw4eOPPy5btqxmN+XPn/+ll146ceKEByIlBAQQQAABBBBAAAEELAmQcLfEx80IIIAAAggggAACbgksXbq0ffv2iYmJkVLtcXFx99xzz9y5c2VvE7eCpF6lQGpq6ogRI0qUKKHZZYUKFZLfTlJSUkBDAAEEEEAAAQQQQMC/AiTc/dt3RI4AAggggAACCIRRQBKyH330Ue3ataMsaZeU7oABA3bv3h1GIM+3+cyZM0OGDJFDazV7sHjx4u+8846k5j3fDgJEAAEEEEAAAQQQQEBDgIQ7HwsEEEAAAQQQQAABfwhs2LChV69eycnJUVLtN95445QpU9LS0vzRpBBHefLkyYEDB0bqTdl8Rn5WkY1oQixE0xFAAAEEEEAAAQR8KUDC3ZfdRtAIIIAAAggggEB4BCTrOm3atJtvvjlHjhyRUu2yCXiPHj3WrVsXHpZgtFSOS3322WeTkpI0e/bKK6/89NNP5djVYDSWViCAAAIIIIAAAgiEQYCEexh6mTYigAACCCCAAAK+FNi3b58sgi5VqlSUJe01a9YcNWrUqVOnfNlCgv5/An/99Ze8uxBpO/5q1arJLy5sxM+HBQEEEEAAAQQQQMAXAiTcfdFNBIkAAggggAACCIRIQFKr8+fPb926dXx8fKRUe65cudq1a7d48eIQuQS9qbt27Xr00UcjdXqdOnW+/fbboBvQPgQQQAABBBBAAAHfC5Bw930X0gAEEEAAAQQQQCAwAidOnBgxYkTVqlWjLGkvV67c4MGDDxw4EJhW0xClwJYtW9q3b58zZ07Nz0DDhg3lxxjEEEAAAQQQQAABBBDwrAAJd892DYEhgAACCCCAAAIhEli9enXXrl3z5s0bKdUuG7g3a9ZsxowZ6enpIXIJa1PXr19/7733Rtq1/5Zbblm6dGlYbWg3AggggAACCCCAgKcFSLh7unsIDgEEEEAAAQQQCLZAamrqxIkTGzVqFGVJe6FChfr06bN58+ZgU9A6tcDKlStbtGgR6bNx5513rlq1CjcEEEAAAQQQQAABBDwlQMLdU91BMAgggAACCCCAQFgEduzY0a9fv6JFi0ZJtdevX3/s2LFnz54NCwrt1BJYsmTJTTfdpPk5kSXwbdq0+eOPP5BDAAEEEEAAAQQQQMAjAiTcPdIRhIEAAggggAACCIRC4NKlS7NmzWrZsmWkTbolr5o7d+5OnTqtWLEiFCI0Up/AvHnzGjRooJl2l89Shw4dtm7dqq8krkIAAQQQQAABBBBAwEEBEu4O4lI0AggggAACCCCAQKbAkSNH3njjjYoVK0ZZ0l6pUqWhQ4cePXoUNwTUApcvX/7mm29q166t+RFKSEh47LHHdu/eDR0CCCCAAAIIIIAAAi4KkHB3EZ+qEUAAAQQQQACBUAgsX768Y8eOsm49Uqo9Li7urrvumj17tqx/D4UIjbQgIB+SqVOnVqlSRfPjlJiY+NRTTx04cMBCDdyKAAIIIIAAAggggIB5ARLu5u24EwEEEEAAAQQQQCCKwJkzZ0aPHl23bt0oS9qLFy/+/PPP79y5E0kEDAlcvHhxwoQJkV6YSEpKeu6553hVwhApFyOAAAIIIIAAAgjYIkDC3RZGCkEAAQQQQAABBBD4X4FNmzb17t27YMGCUVLtjRs3njRp0vnz54FDwLRAWlraBx98UKZMGc1PWnJy8iuvvHLq1CnT5XMjAggggAACCCCAAAJGBUi4GxXjegQQQAABBBBAAAFtgfT09C+//PK2227LkSNHpFR7vnz5unXrtnbtWhARsEvg3Llzw4YNK1asmOanrkiRIm+++ebZs2ftqo5yEEAAAQQQQAABBBCIIkDCnY8HAggggAACCCCAgFWB/fv3Dxo0KNJC44w0aLVq1d57772TJ09arYz7EdASSElJefXVVyO9V1GyZEn5+PFGBZ8dBBBAAAEEEEAAAacFSLg7LUz5CCCAAAIIIIBAYAUuX768cOHC++67LyEhIdKSdvlPbdu2/fHHH+XiwELQMM8IHD9+fMCAAfIiheYHsnz58mPGjJFXMTwTL4EggAACCCCAAAIIBE2AhHvQepT2IIAAAggggAACMRCQheojR46sXr16lF3aZcG77KAti99jEA9VIKAUOHz48NNPP50nTx7Nz+dVV10l5wdcunQJNAQQQAABBBBAAAEEbBcg4W47KQUigAACCCCAAAJBFpDt1x9//PFIK4glvykbuN96662ymTvriIP8OfBD2/bt29ejR49cuXJppt1r1Kgxffp0XrzwQ08SIwIIIIAAAggg4CcBEu5+6i1iRQABBBBAAAEE3BKQza8nT57cuHHjKEvaZfvsp556atOmTW4FSb0IqAV27NjxyCOPxMXFaX5069evP3v2bNwQQAABBBBAAAEEELBLgIS7XZKUgwACCCCAAAIIBFNg165d/fv3L168eJRUe506dUaPHn3mzJlgEtAq/wvI70Dt2rXLmTOn5sdYfkmS0wj830pagAACCCCAAAIIIOC+AAl39/uACBBAAAEEEEAAAQ8KyA7Xc+bMueuuuyItDZbEZWJiYocOHZYvX+7B+AkJAbWAbIh09913y65Hmmn3pk2b/vzzz7ghgAACCCCAAAIIIGBFgIS7FT3uRQABBBBAAAEEAihw9OjRt956q1KlSlGWtFesWPGNN96QoykD2H6aFHSBFStWNGvWLNLHW35kWrNmTdANaB8CCCCAAAIIIICAUwIk3J2SpVwEEEAAAQQQQMB3Ar/88kunTp3y5MkTKRcpO3Lceeeds2bNkvXvvmsdASOgFFi0aNENN9yg+VGXJfD333//xo0bEUMAAQQQQAABBBBAwKgACXejYlyPAAIIIIAAAggETeDs2bPjxo2T0yOjLGkvWrRov379tm/fHrTG055wC8i+Sddee63mJ182U5Lfn/jMh/sDQusRQAABBBBAAAHDAiTcDZNxAwIIIIAAAgggEBiBLVu29OnTp1ChQlFS7Q0bNpw4cWJqampgWk1DEFAKXL58+auvvqpZs6bmX0FCQkL37t337t0LGgIIIIAAAggggAACegRIuOtR4hoEEEAAAQQQQCBQAhcvXpwxY4ZsYx3p9EjJPCYlJXXt2nXVqlWBajmNQSCCgOySNHny5Kuvvloz7Z47d275aerQoUP4IYAAAggggAACCCAQXYCEO58QBBBAAAEEEEAgRAIHDhwYPHhwuXLloixpr1KlyogRI06cOBEiF5qKwP8TSE9PHzt2bIUKFTT/QPLly/fCCy8cP34cLQQQQAABBBBAAAEEIgmQcOezgQACCCCAAAIIhEJg8eLF7dq1y5UrV6RUe3x8fOvWrX/44QfZYSMUIjQSgQgC58+fHzlyZKlSpTT/WAoWLCi/Wp0+fRo/BBBAAAEEEEAAAQTUAiTc+VQggAACCCCAAAJBFpC04KhRoyLtT52RT5TE4sCBA9mlOsifA9pmXEAOEx46dGiRIkU00+5yjPDbb7997tw54wVzBwIIIIAAAggggECQBUi4B7l3aRsCCCCAAAIIhFlg/fr1PXv2zJ8/f6Ql7bKB+8033/z5559fuHAhzFC0HYEoAqdOnRo0aFCBAgU0/45Kly4tP2ilpaVhiAACCCCAAAIIIIBAhgAJdz4JCCCAAAIIIIBAoAQk9zdlypQmTZpE2aU9OTm5V69eGzZsCFTLaQwCjgkcO3bs+eefz5s3r+af1RVXXDF+/HjZ/92x+ikYAQQQQAABBBBAwDcCJNx901UEigACCCCAAAIIRBfYs2fPiy++WLJkySip9tq1a3/44YcpKSlgIoCAUYGDBw/27t07d+7cmn9ilStXlt+6Ll26ZLRYrkcAAQQQQAABBBAIkgAJ9yD1Jm1BAAEEEEAAgTAKyBmnc+fObdWqVVxcXKRUu5yV2r59+yVLloQRiDYjYKuA/LLVrVu3hIQEzT+3WrVqff3115w8bCs5hSGAAAIIIIAAAn4SIOHup94iVgQQQAABBBBAQClw/Pjx4cOHX3311VGWtFeoUOG11147dOgQdAggYKPAtm3bOnbsGOlXruuuu05+BrOxOopCAAEEEEAAAQQQ8IsACXe/9BRxIoAAAggggAAC/yuwcuXKLl26JCUlRUq158yZs3nz5t98883FixeBQwABhwTkIIS2bdvK+cOaf4lylMLixYsdqppiEUAAAQQQQAABBLwpQMLdm/1CVAgggAACCCCAgIbAuXPnPvnkkwYNGkRZ0l64cOFnnnlm69atCCKAQGwEVq9e3bJly0h/lfLT16+//hqbSKgFAQQQQAABBBBAwHUBEu6udwEBIIAAAggggAAC2QvI/hV9+/YtUqRIlFS77GIxYcIEScpnXxxXIICA3QLLli279dZbNf9CZQm8nLKwbt06u+ukPAQQQAABBBBAAAHPCZBw91yXEBACCCCAAAIIIJApIBvCzJw5s0WLFrJFTKRUe548eTp37iybzOCGAAKuCyxYsKBRo0aaf63yV/zggw9u3rzZ9SAJAAEEEEAAAQQQQMA5ARLuztlSMgIIIIAAAgggYF5Ajjl9/fXX5cjTKEva5bjUYcOGHTt2zHw13IkAAg4IzJo1q27dupp/vPHx8XIAw86dOx2oliIRQAABBBBAAAEE3Bcg4e5+HxABAggggAACCCCgFFi6dGn79u0TExMjpdrj4uLuueeeuXPnXr58GToEEPCmgPx5fvHFF9WrV9f8Q86VK9cTTzyxf/9+bwZPVAgggAACCCCAAAKmBUi4m6bjRgQQQAABBBBAwE6BlJSUjz76qHbt2lGWtJcoUWLAgAG7d++2s2LKQgABxwRkV6iJEydWqlRJ8+9a9oOSsxmOHDniWP0UjAACCCCAAAIIIBBrARLusRanPgQQQAABBBBAIIvAhg0bevXqlZycHCXVfuONN06ZMiUtLQ09BBDwncCFCxc+/vjjsmXLav6N58+f/6WXXjpx4oTv2kXACCCAAAIIIIAAAmoBEu58KhBAAAEEEEAAAXcEJAc3bdq0m2++OUeOHJFS7ZKJ69Gjx7p169wJkVoRQMA+gdTU1BEjRsh7Kpp/74UKFZJjG+RNF/sqpCQEEEAAAQQQQAABFwRIuLuATpUIIIAAAgggEHKBffv2DRw4sFSpUlGWtNesWXPUqFGnTp0KuRXNRyBgAmfOnBkyZEjhwoU1//yLFy/+zjvvSGo+YK2mOQgggAACCCCAQHgESLiHp69pKQIIIIAAAgi4LCCHKM6fP79169bx8fGRUu1ylGK7du0WL17scqxUjwACTgqcPHlSfnWLtJGUbD4jJzrISzBOhkDZCCCAAAIIIIAAAo4IkHB3hJVCEUAAAQQQQAABpYDszixbSVStWjXKkvZy5coNHjz4wIED0CGAQEgE5LjUZ599NikpSXNkuPLKKz/99FM5djUkGjQTAQQQQAABBBAIhgAJ92D0I61AAAEEEEAAAY8KrF69umvXrnnz5o2UapcN3Js1azZjxoz09HSPtoGwEEDASYG//vpLjk1OTEzUHCWqVasmhz3I+zFOhkDZCCCAAAIIIIAAArYJkHC3jZKCEEAAAQQQQACBTAHZgnnixImNGjWKsqRdzkjs06fP5s2bcUMAAQR27dr16KOPRtpvqk6dOt9++y1KCCCAAAIIIIAAAt4XIOHu/T4iQgQQQAABBBDwk8COHTv69etXtGjRKKn2+vXrjx079uzZs35qGLEigIDzAlu2bGnfvn3OnDk1B5CGDRvKORDOR0ENCCCAAAIIIIAAAuYFSLibt+NOBBBAAAEEEEAgU+DSpUuzZs1q2bJlpEyZpM9y587dqVOnFStW4IYAAghEEVi/fv29994r+01ppt1vueWWpUuXAogAAggggAACCCDgTQES7t7sF6JCAAEEEEAAAd8IyLGHb7zxRsWKFaMsaa9UqdLQoUOPHj3qm1YRKAIIuC2wcuXKFi1aRBpY7rzzzlWrVrkdI/UjgAACCCCAAAIIZBUg4c5nAgEEEEAAAQQQMCmwfPnyjh07yrr1SBmxuLi4u+66a/bs2bL+3WQd3IYAAuEWWLJkyU033aQ5yMgS+DZt2vzxxx/hFqL1CCCAAAIIIICAtwRIuHurP4gGAQQQQAABBLwvcObMmdGjR9etWzfKkvbixYs///zzO3fu9H5ziBABBLwvMG/evAYNGmiOObKNVYcOHbZu3er9VhAhAggggAACCCAQBgES7mHoZdqIAAIIIIAAAvYIbNq0qXfv3gULFoySam/cuPGkSZPOnz9vT5WUggACCPw/gcuXL3/zzTe1a9fWHH8SEhIee+yx3bt3o4UAAggggAACCCDgrgAJd3f9qR0BBBBAAAEEfCCQnp7+5Zdf3nbbbZHOMJT8V758+bp167Z27VoftIcQEUDAtwKyP9XUqVOrVKmimXZPTEx86qmnDhw44Nv2ETgCCCCAAAIIIOB7ARLuvu9CGoAAAggggAACzgns379/0KBBZcqUibKkvVq1au+9997JkyedC4OSEUAAAaXAxYsXJ0yYEOms5qSkpOeee45TmvnMIIAAAggggAACrgiQcHeFnUoRQAABBBBAwNMCsnXDwoUL77vvPtmlIVKqXf5T27Ztf/zxR7nY040hOAQQCKhAWlraBx98EOkXweTk5FdeeeXUqVMBbT3NQgABBBBAAAEEPCpAwt2jHUNYCCCAAAIIIOCKgCxUHzlyZPXq1aMsaZf0lqSxZPG7KxFSKQIIIKAUOHfu3LBhw4oVK6Y5ahUpUuTNN988e/YsaAgggAACCCCAAAKxESDhHhtnakEAAQQQQAABrwvI9uuPP/64bMUeKdUuG7jfeuutspm7bOnu9cYQHwIIhEwgJSXl1VdfjXSkc8mSJWXnKw5zDtmHguYigAACCCCAgDsCJNzdcadWBBBAAAEEEPCIgGSgJk+e3Lhx4yhL2iWHJecQbtq0ySMxEwYCCCCgKXD8+PEBAwZE+uGwfPnyY8aM4SdDPjwIIIAAAggggICjAiTcHeWlcAQQQAABBBDwrsCuXbv69+9fvHjxKKn2OnXqjB49+syZM95tBpEhgAAC/y1w+PDhp59+Ok+ePJqD21VXXTVp0qRLly7BhgACCCCAAAIIIOCEAAl3J1QpEwEEEEAAAQS8KyBppjlz5tx1111xcXGRUu2JiYkdOnRYvny5d5tBZAgggEBUgX379vXo0SNXrlyaA12NGjWmT5/Omc98iBBAAAEEEEAAAdsFSLjbTkqBCCCAAAIIIOBRgaNHj7711luVKlWKsqS9YsWKb7zxhqwP9WgbCAsBBBAwIrBjx45HHnkk0u+L9evXnz17tpHyuBYBBBBAAAEEEEAgGwES7nxEEEAAAQQQQCD4Ar/88kunTp0ibbAg+fecOXPeeeeds2bNYpuF4H8aaCEC4ROQIyjatWsnA53mz41yiMXChQvDp0KLEUAAAQQQQAABRwRIuDvCSqEIIIAAAggg4AWBs2fPjhs3TpZwRlnSXrRo0X79+m3fvt0LARMDAggg4JzA2rVr77777hw5cmgOiU2bNv3555+dq52SEUAAAQQQQACBkAiQcA9JR9NMBBBAAAEEwiWwZcuWPn36FCpUKEqqvWHDhhMnTkxNTQ0XDa1FAIFwC6xYsaJZs2aRxkY532LNmjXhFqL1CCCAAAIIIICAJQES7pb4uBkBBBBAAAEEPCVw8eLFGTNmSC4p0hJOyTElJSV17dp11apVnoqcYBBAAIFYCixatOiGG27QTLvL+Hn//fdv3LgxlvFQFwIIIIAAAgggEBgBEu6B6UoaggACCCCAQKgFDhw4MHjw4HLlykVZ0l6lSpURI0acOHEi1FI0HgEEEPj/AnPmzLn22ms1h005Z1WOvmC7LT4sCCCAAAIIIICAUQES7kbFuB4BBBBAAAEEvCWwePFiOQwwV65ckVLt8fHxrVu3/uGHHy5fvuyt0IkGAQQQcFtABsavvvqqZs2amkNoQkJC9+7d9+7d63aY1I8AAggggAACCPhGgIS7b7qKQBFAAAEEEEBAKXD69OlRo0ZFShJlZI5KlSo1cOBAUkV8chBAAIHoApcuXZo8efLVV1+tmXbPnTu3nIpx6NAhGBFAAAEEEEAAAQSyFSDhni0RFyCAAAIIIICAtwTWr1/fs2fP/PnzR1rSLhsQ33zzzZ9//vmFCxe8FTrRIIAAAh4WSE9PHzt2bIUKFTRH13z58r3wwgvHjx/3cAsIDQEEEEAAAQQQcF+AhLv7fUAECCCAAAIIIKBHIC0tbcqUKU2aNImyS3tycnKvXr02bNigp0CuQQABBBBQC5w/f37kyJHyhpDmYFuwYEE5MEPeMYIOAQQQQAABBBBAQFOAhDsfDAQQQAABBBDwusCePXtefPHFkiVLRkm1165d+8MPP0xJSfF6Y4gPAQQQ8IPA2bNnhw4dWqRIEc2Bt2jRom+//fa5c+f80BRiRAABBBBAAAEEYipAwj2m3FSGAAIIIIAAAvoF5Ci/uXPntmrVKi4uLlKqXc5Kbd++/ZIlS/QXy5UIIIAAAjoFTp06NWjQoAIFCmgOwqVLl5azNOT1I52lcRkCCCCAAAIIIBAGARLuYehl2ogAAggggIDPBGSP4OHDh0c6vi8j7yO7DL/22msc4uezriVcBBDwocCxY8eef/75vHnzaqbdr7jiivHjx8v+7z5sGSEjgAACCCCAAAL2C5Bwt9+UEhFAAAEEEEDAtMDKlSu7dOmSlJQUaUl7zpw5mzdv/s0331y8eNF0LdyIAAIIIGBU4ODBg717986dO7fm+Fy5cmU5ZuPSpUtGi+V6BBBAAAEEEEAgYAIk3APWoTQHAQQQQAABXwrIRsCffPJJgwYNouzSXrhw4WeeeWbr1q2+bCFBI4AAAoEQkEM1unXrlpCQoDlc16pV6+uvv5YNwQLRVhqBAAIIIIAAAgiYESDhbkaNexBAAAEEEEDALoFt27b17ds30rl8GQmd6667bsKECZzOZ5c55SCAAAIWBWTo7tixY6QDNmTQlhM4LFbB7QgggAACCCCAgE8FSLj7tOMIGwEEEEAAAX8LyIYwM2fObNGihWwRE2lVe548eTp37iybzPi7qUSPAAIIBFRgw4YNbdu2zZEjh+Yw3qRJk8WLFwe06TQLAQQQQAABBBCIKEDCnQ8HAggggAACCMRUQI45ff311+XI0yi7x8hxqcOGDZNj+mIaGZUhgAACCBgXWL16dcuWLSMN6XLqxq+//mq8VO5AAAEEEEAAAQT8KkDC3a89R9wIIIAAAgj4TmDp0qXt27dPTEyMlJeR3Qnuuece2YiA/X9917kEjAACIRdYtmzZrbfeqjm8yxL4Vq1arVu3LuRENB8BBBBAAAEEQiJAwj0kHU0zEUAAAQQQcE0gJSXlo48+ql27dpQl7SVKlBgwYMDu3btdi5KKEUAAAQQsCyxYsKBRo0aao71sIPbggw9u3rzZciUUgAACCCCAAAIIeFqAhLunu4fgEEAAAQQQ8LWAbO/bq1ev5OTkKKn2G2+8ccqUKWlpab5uKcEjgAACCGQKzJo1q27dupojf3x8fJcuXXbu3AkXAggggAACCCAQVAES7kHtWdqFAAIIIICAawIXLlyYNm3azTffHOkkPcnC5M+fv0ePHuww4FonUTECCCDgpIDsDPbFF19Ur15dM+2eK1euJ554Yv/+/U6GQNkIIIAAAggggIA7AiTc3XGnVgQQQAABBAIpsG/fvoEDB5YqVSrKkvaaNWuOGjXq1KlTgRSgUQgggAACmQIXL16cOHFipUqVNB8KefLk6du375EjRxBDAAEEEEAAAQSCJEDCPUi9SVsQQAABBBBwR0BWMs6fP79169ayV0CkVLusZ2zXrt3ixYvdCZFaEUAAAQRcEpDXnj7++OOyZctqPiDkhaeXXnrpxIkTLkVHtQgggAACCCCAgM0CJNxtBqU4BBBAAAEEQiUgKZIRI0ZUrVo1ypL2cuXKDR48+MCBA6GSobEIIIAAAkqB1NRUeV7IEdmaz4tChQq9/vrrcsg2aAgggAACCCCAgN8FSLj7vQeJHwEEEEAAAXcEVq9e3bVr17x580ZKtcsG7s2aNZsxY0Z6ero7IVIrAggggIDHBM6cOTNkyJDChQtrPjuKFy/+zjvvSGreY1ETDgIIIIAAAgggYECAhLsBLC5FAAEEEEAAAcmDyIa8jRo1irKkXRYq9unTZ/PmzXAhgAACCCCgFjh58qQc+JGcnKz5KJHNZz766CPZiAY6BBBAAAEEEEDAjwIk3P3Ya8SMAAIIIICACwI7duzo169f0aJFo6Ta69evP3bs2LNnz7oQH1UigAACCPhKQI5LffbZZ5OSkjQfK1deeeWnn34qx676qk0EiwACCCCAAAII/JuEOx8CBBBAAAEEEIgmcOnSpVmzZrVs2TJnzpyRUu25c+fu1KnTihUroEQAAQQQQMCQwF9//dWrV6/ExETNR0y1atWmTZsmR3MbKpOLEUAAAQQQQAABFwVIuLuIT9UIIIAAAgh4WkDWHr7xxhsVK1aMsqS9UqVKQ4cOPXr0qKdbQnAIIIAAAt4W2LVr16OPPhofH6/5xKlTp863337r7RYQHQIIIIAAAggg8B8BEu58FBBAAAEEEEAgq8Dy5cs7duwo69Yjpdrj4uLuuuuu2bNny/p3+BBAAAEEELBFYMuWLe3bt4/0QlXDhg3nz59vS0UUggACCCCAAAIIOCdAwt05W0pGAAEEEEDAZwJnzpwZPXp03bp1oyxpL168+PPPP79z506ftY1wEUAAAQR8IrB+/fp77703R44cmg+jW265ZenSpT5pCmEigAACCCCAQBgFSLiHsddpMwIIIIAAAlkENm3a1Lt374IFC0ZJtTdu3HjSpEnnz59HDwEEEEAAAacFVq5c2aJFi0hPpTvvvHPVqlVOx0D5CCCAAAIIIICACQES7ibQuAUBBBBAAIGACKSnp3/55Ze33XZbpIWEkunIly9ft27d1q5dG5A20wwEEEAAAf8ILFmy5KabbtJMu8uTq02bNn/88Yd/WkOkCCCAAAIIIBAKARLuoehmGokAAggggEAWgf379w8aNKhMmTJRlrRXq1btvffeO3nyJHoIIIAAAgi4KDBv3rwGDRpoPrBkw/cOHTps3brVxfCoGgEEEEAAAQQQUAqQcOfzgAACCCCAQIgELl++vHDhwvvuuy8hISFSql3+U9u2bX/88Ue5OEQ0NBUBBBBAwMMC8kj65ptvateurfnwkifXY489tnv3bg+3gNAQQAABBBBAICwCJNzD0tO0EwEEEEAg5AKyUH3kyJHVq1ePsqRdFry/8sorsvg95FY0HwEEEEDAmwKXLl2aOnVqlSpVNJ9liYmJTz311IEDB7wZPFEhgAACCCCAQEgESLiHpKNpJgIIIIBAeAVk+/XHH39ctmKPlGqXbXBvvfVW2cxdtnQPLxMtRwABBBDwicDFixcnTJhQsWJFzedaUlLSc889d/ToUZ+0hjARQAABBBBAIGgCJNyD1qO0BwEEEEAAgQyB8+fPT548uXHjxlGWtBcsWFAWA27atAk0BBBAAAEE/CWQlpb2wQcfRDqMJDk5Wd7ZOnXqlL8aRbQIIIAAAgggEAABEu4B6ESagAACCCCAwH8J7Nq1q3///sWLF4+Saq9Tp87o0aPPnDmDHQIIIIAAAv4VOHfu3LBhw4oVK6b5yCtSpMibb7559uxZ/zaQyBFAAAEEEEDAdwIk3H3XZQSMAAIIIICAtoDsbDtnzpy77rorLi4uUqpd9rft0KHD8uXLQUQAAQQQQCAwAikpKa+++qq8tqX5+CtZsuR7770nL34Fpr00BAEEEEAAAQS8LEDC3cu9Q2wIIIAAAgjoEpCdat96661KlSpFWdIue92+8cYbhw8f1lUiFyGAAAIIIOA3gePHjw8YMCDSmSXly5cfM2YMp5X4rVeJFwEEEEAAAf8JkHD3X58RMQIIIIAAApkCv/zyS6dOnfLkyRMp1Z4zZ84777xz1qxZsv4dNwQQQAABBAIvID8tP/3005GejFddddWkSZN4Jgb+Y0ADEUAAAQQQcFGAhLuL+FSNAAIIIICASQHZjnbcuHH169ePsqS9aNGi/fr12759u8k6uA0BBBBAAAHfCuzbt69Hjx65cuXSfFDWqFFj+vTply9f9m37CBwBBBBAAAEEvCtAwt27fUNkCCCAAAIIqAW2bNnSp0+fQoUKRUm1N2zYcOLEiampqQAigAACCCAQZoEdO3Y88sgjkY42kd+tZ8+eHWYf2o4AAggggAACTgiQcHdClTIRQAABBBCwWeDixYszZsxo1qxZjhw5IqXak5KSunbtumrVKpvrpjgEEEAAAQT8LLBp06Z27drJHmuaD9DGjRsvXLjQz+0jdgQQQAABBBDwlgAJd2/1B9EggAACCCCQReDAgQODBw8uV65clCXtVapUGTFixIkTJ9BDAAEEEEAAAU2BtWvX3n333ZF+t27atOnPP/8MHQIIIIAAAgggYF2AhLt1Q0pAAAEEEEDAEYHFixfLirxI+89K/j0+Pr5169Y//PADu9A60gEUigACCCAQOIEVK1bI62KRfsO+66671qxZE7hG0yAEEEAAAQQQiKkACfeYclMZAggggAAC2QqcPn161KhRNWvWjLKkvVSpUgMHDty7d2+2pXEBAggggAACCGQRWLRo0Q033KD5nJUl8Pfff//GjRtBQwABBBBAAAEEzAmQcDfnxl0IIIAAAgjYL7B+/fqePXvmz58/UqpdsgA333zz559/fuHCBfurp0QEEEAAAQTCJDBnzpxrr71W85kr56x26tRp+/btYfKgrQgggAACCCBgjwAJd3scKQUBBBBAAAHTAmlpaVOmTGnSpEmUJe3Jycm9evXasGGD6Vq4EQEEEEAAAQSyCMiebF999VWkt8oSEhK6d+/O+2R8bBBAAAEEEEDAkAAJd0NcXIwAAggggICdAnv27HnxxRdLliwZJdVeu3btDz/8MCUlxc6KKQsBBBBAAAEE/r/ApUuXJk+efPXVV2s+jnPnzt2nT59Dhw4BhgACCCCAAAII6BEg4a5HiWsQQAABBBCwU0DW082dO7dVq1byxnqkVLucldq+ffslS5bYWTFlIYAAAggggEAEgfT09LFjx1aoUEHz0ZwvX74XXnjh+PHj+CGAAAIIIIAAAtEFSLjzCUEAAQQQQCB2AvJFffjw4ZHW0GV8w5ev+q+99hor6WLXK9SEAAIIIIDA/xc4f/78yJEj5XByzbR7wYIFBw8eLMebA4YAAggggAACCEQSIOHOZwMBBBBAAIFYCKxcubJLly5JSUmRlrTnzJmzefPm33zzzcWLF2MREHUggAACCCCAQASBs2fPDh06tEiRIppP7aJFi7799tvnzp3DDwEEEEAAAQQQUAuQcOdTgQACCCCAgIMC8m38k08+adCgQZRd2gsXLvzMM89s3brVwTgoGgEEEEAAAQQMCpw6dWrQoEEFChTQfIiXLl161KhRcvK5wVK5HAEEEEAAAQQCLkDCPeAdTPMQQAABBNwS2LZtW9++fSMtjsv46n7ddddNmDCBJXJu9RH1IoAAAgggkK3AsWPHnn/++bx582qm3a+44orx48fL/u/ZlsMFCCCAAAIIIBASARLuIelomokAAgggECMB2RBm5syZLVq0kC1iIq1qz5MnT+fOnWWTmRjFRDUIIIAAAgggYE3g4MGDvXv3zp07t+bDvXLlylOmTLl06ZK1SrgbAQQQQAABBIIgQMI9CL1IGxBAAAEEvCAgx5y+/vrrcuRplN1j5LjUYcOGyVo5LwRMDAgggAACCCBgSGDPnj3dunVLSEjQfNbXqlXr66+/vnz5sqEyuRgBBBBAAAEEAiZAwj1gHUpzEEAAAQRcEFi6dGn79u0TExMjpdrj4uLuueeeuXPn8iXche6hSgQQQAABBGwVkF3jOnbsKA93zee+7BcnT3xbK6QwBBBAAAEEEPCTAAl3P/UWsSKAAAIIeEogJSXlo48+ql27dpQl7SVKlBgwYMDu3bs9FTnBIIAAAggggIBFgQ0bNrRt2zZHjhya04AmTZosXrzYYhXcjgACCCCAAAJ+FCDh7sdeI2YEEEAAAZcF5Dt2r169kpOTo6Tab7zxRtnONS0tzeVYqR4BBBBAAAEEHBNYvXp1y5YtI80Hmjdv/uuvvzpWOQUjgAACCCCAgBcFSLh7sVeICQEEEEDAmwIXLlyYNm3azTffHGk5m3zfzp8/f48ePdatW+fNJhAVAggggAACCNgusGzZsltvvVUz7S5zhlatWjExsN2cAhFAAAEEEPCsAAl3z3YNgSGAAAIIeEhg3759AwcOLFWqVJQl7TVr1hw1atSpU6c8FDehIIAAAggggECsBBYsWNCoUSPNqULOnDkffPDBzZs3xyoW6kEAAQQQQAAB1wRIuLtGT8UIIIAAAt4XkDNO58+f37p16/j4+Eip9ly5crVr1459Wr3fm0SIAAIIIIBADARmzZpVt25dzWmDTCe6dOmyc+fOGIRBFQgggAACCCDglgAJd7fkqRcBBBBAwNMCJ06cGDFiRNWqVaMsaS9XrtzgwYMPHDjg6ZYQHAIIIIAAAgjEVkB+sP/iiy+qV6+uOYuQn+qfeOKJ/fv3xzYoakMAAQQQQACBGAmQcI8RNNUggAACCPhFQE4/69q1a968eSOl2mUz1mbNms2YMSM9Pd0vjSJOBBBAAAEEEIixwMWLFydOnFipUiXNGUWePHn69u175MiRGEdFdQgggAACCCDgtAAJd6eFKR8BBBBAwB8Cqamp8q040tarGV+VCxUq1KdPHzZg9UePEiUCCCCAAAIeEJAT1z/++OOyZctqpt3lrPWXXnpJ3qvzQKSEgAACCCCAAAL2CJBwt8eRUhBAAAEE/CuwY8eOfv36FS1aNMruMfXr1x87duzZs2f920wiRwABBBBAAAG3BOR3fdmqrkSJEpqTDflF//XXX09JSXErPOpFAAEEEEAAARsFSLjbiElRCCCAAAJ+Erh06ZIca9ayZcucOXNGSrXnzp27U6dOK1as8FPDiBUBBBBAAAEEPClw5syZIUOGFC5cWHPiUbx48XfeeUdS856MnaAQQAABBBBAQK8ACXe9UlyHAAIIIBAYAdkv9Y033qhYsWKUJe2y4+rQoUOPHj0amFbTEAQQQAABBBDwgsDJkycHDhyYnJysOQ+RzWc++ugj2YjGC6ESAwIIIIAAAgiYECDhbgKNWxBAAAEE/CqwfPnyjh07yrr1SKn2uLi4u+66a/bs2bL+3a+NJG4EEEAAAQQQ8LyA/Pz/7LPPJiUlac5Jrrzyyk8//VSOXfV8OwgQAQQQQAABBLIKkHDnM4EAAgggEHwBeYN79OjRdevWjbKkXd7jfv7553fu3Bl8DlqIAAIIIIAAAt4Q+Ouvv3r16pWYmKg5RalWrdq0adMuX77sjWCJAgEEEEAAAQR0CZBw18XERQgggAACPhXYtGlT7969CxYsGCXV3rhx40mTJp0/f96nbSRsBBBAAAEEEPC1wK5dux599NH4+HjN6UqdOnW+/fZbXzeQ4BFAAAEEEAiVAAn3UHU3jUUAAQTCIpCenv7ll1/edtttOXLkiJRqz5cvX7du3dauXRsWFNqJAAIIIIAAAh4W2LJlS/v27SOd5d6wYcP58+d7OHxCQwABBBBAAIH/CJBw56OAAAIIIBAogf379w8aNKhMmTJRlrTLC9rvvfeeHFkWqJbTGAQQQAABBBDwv8D69evvvffeSCsGbrnllqVLl/q/lbQAAQQQQACBIAuQcA9y79I2BBBAIDwCsr3pwoUL77vvvoSEhEipdvlPbdu2/fHHH9kLNTwfDFqKAAIIIICAHwVWrlzZokWLSFOaO++8c9WqVX5sFzEjgAACCCAQBgES7mHoZdqIAAIIBFlAFqqPHDmyevXqUZa0y4L3V155RRa/BxmCtiGAAAIIIIBAsASWLFly0003ac5wZAl8mzZt/vjjj2C1mNYggAACCCAQBAES7kHoRdqAAAIIhFNAtl9//PHHZSv2SKl2+S566623ymbusqV7OIloNQIIIIAAAgj4XWDevHkNGjTQnO3Ihu8dOnTYunWr39tI/AgggAACCARJgIR7kHqTtiCAAAKhEDh//vzkyZMbN24cZUl7wYIFn3rqqU2bNoVChEYigAACCCCAQKAFZDe8b775pnbt2pqTH9k077HHHtu9e3egDWgcAggggAACvhEg4e6briJQBBBAAIFdu3b179+/ePHiUVLtderUGT169JkzZ+BCAAEEEEAAAQSCJHDp0qWpU6dWqVJFcyKUmJgoqw0OHDgQpCbTFgQQQAABBPwoQMLdj71GzAgggEC4BOTr5Zw5c+666664uLhIqXb5kimvVC9fvjxcNLQWAQQQQAABBEImcPHixQkTJlSsWFFzUpSUlPTcc88dPXo0ZCo0FwEEEEAAAQ8JkHD3UGcQCgIIIIBAFgH5uvjWW29VqlQpypJ2+cL5xhtvHD58GD0EEEAAAQQQQCAkAmlpaR988IEcC685R0pOTpbj4k+dOhUSDZqJAAIIIICApwRIuHuqOwgGAQQQ8K6A7Jwey+B++eWXTp065cmTJ1KqXU4Ju/POO2fNmiXr32MZGHUhgAACCCCAAAIeETh37tywYcOKFSumOV8qUqTIm2++efbsWY9ESxgIIIAAAgiERICEe0g6mmYigAAClgRkhdQzzzxjqQh9N8t3wnHjxtWvXz/KkvaiRYv269dv+/bt+orkKgQQQAABBBBAIMgCKSkpr776qpwYrzl9Klmy5HvvvRfjlRNB5qZtCCCAAAIIZCdAwj07If47AgggEHqBCxcu3H777e3atXNUYsuWLX369ClUqFCUVHvDhg0nTpyYmprqaCQUjgACCCCAAAII+E7g+PHjAwYMyJcvn+ZUqnz58mPGjElPT/dduwgYAQQQQAAB3wmQcPddlxEwAgggEGuBrl27yje3Hj16OFGxHPw1Y8aMZs2a5ciRI1KqXY7/khhWrVrlRACUiQACCCCAAAIIBEZATrV5+umnI23Kd9VVV02aNInt+ALT3TQEAQQQQMCbAiTcvdkvRIUAAgh4ReC1117LyIPLmil7Yzpw4MDgwYPLlSsXZUl7lSpVRowYceLECXurpjQEEEAAAQQQQCDAAvv27ZOlErly5dKcZdWoUWP69OmXL18OsABNQwABBBBAwEUBEu4u4lM1Aggg4HWBzz77LHPhuRzJZVe4ixcvlg1qIn0JlG+G8fHxrVu3/uGHH/gqaJc55SCAAAIIIIBA2AR27NjxyCOPxMXFaabd5cic2bNnh82E9iKAAAIIIBADARLuMUCmCgQQQMCXAj/99FNiYmLmN7RPPvnEYjNOnz49atSomjVrRlnSXqpUqYEDB+7du9diXdyOAAIIIIAAAgggIAKbNm2ShQ45c+bUnIA1btx44cKFQCGAAAIIIICAjQIk3G3EpCgEEEAgOAJ//vln4cKFlV/MZs6cabp569ev79mzZ/78+SOl2mUd/c033/z555/LAa2ma+FGBBBAAAEEEEAAAU2BtWvX3n333ZGOzGnatOnPP//sHB27xjtnS8kIIIAAAh4UIOHuwU4hJAQQQMBlATluq1KlSlmS40uXLjUaVlpa2pQpU5o0aRJlSXtycnKvXr02bNhgtHCuRwABBBBAAAEEEDAksGLFCjmpPtLE7K677lqzZo2hAnVeLGcCkXPXacVlCCCAAAIBECDhHoBOpAkIIICAnQLnzp1r2LCh+pvYxo0b9VezZ8+eF198sWTJklFS7bVr1/7www9TUlL0F8uVCCCAAAIIIIAAAhYFFi1adMMNN2hO0mQJ/P33329o1qcnGHmRUXLueq7kGgQQQAABBAIgQMI9AJ1IExBAAAHbBGTxUZs2bTS/gB08eDDbauSM07lz57Zq1SrS8VxSspyV2r59+yVLlmRbGhcggAACCCCAAAIIOCQwZ86ca6+9VnPWJxO5Tp06bd++3a6qJb8fHx+/fPlyuwqkHAQQQAABBLwsQMLdy71DbAgggECsBZ555plIy52i765+/Pjx4cOHX3311VGWtFeoUEEWNx06dCjWraI+BBBAAAEEEEAAAZWALJX46quvIh1on5CQ0L17d1uOsm/UqJFMEa+44ooTJ07QDwgggAACCARegIR74LuYBiKAAAJ6BUaNGhUpXS7nnUYqZeXKlV26dElKSop0b86cOZs3b/7NN99cvHhRbyhchwACCCCAAAIIIBATAXnBcfLkyZGWTeTOnbtPnz4WF0xcd911GRNF2a8mJm2iEgQQQAABBNwUIOHupj51I4AAAt4R+Pbbb6PsAyOL07OEKlu9f/LJJw0aNIiypL1w4cKyZH7r1q3eaSaRIIAAAggggAACCKgF0tPTx44dK1M+zaldvnz5XnjhBXmj0RxdvXr1MosdM2aMuUK4CwEEEEAAAb8IkHD3S08RJwIIIOCgwKpVq+R7VJTUuXxNyqx+27Ztffv2LVKkSJTrZR3ThAkTJCnvYNAUjQACCCCAAAIIIGCrwPnz50eOHFmqVCnNaV7BggUHDx58+vRpo3XWrl07s0B5LdL2Q1mNxsP1CCCAAAIIOCpAwt1RXgpHAAEEfCCwe/fuSF+rMr8aNW3aVDaEmTlzZosWLWSLmEip9jx58nTu3Fk2mfFBswkRAQQQQAABBBBAQEvg7NmzQ4cOjbS6omjRom+//bahdRU1atRQzh4l/56amoo9AggggAACQRUg4R7UnqVdCCCAgC6BkydPRjopS/m9qFatWpFeMc64TPb9HDZs2LFjx3TVykUIIIAAAggggAAC3hY4derUoEGDChQooLnSonTp0nL8T1pamp5GVKlSJUshvXr10nMj1yCAAAIIIOBHARLufuw1YkYAAQTsEbhw4YIsXY+yM0y2/0m2fb/nnnvmzp17+fJle2KiFAQQQAABBBBAAAHPCMhyiueffz5v3rya08Irrrhi/Pjxsv979HgrVaqU5fYcOXJ8/fXXnmklgSCAAAIIIGCnAAl3OzUpCwEEEPCXgGz/km1KPdIFJUqUGDBggGxH468mEy0CCCCAAAIIIICAUYGDBw/27t07d+7cmjPDypUrT5ky5dKlS5GKlby8+kbZsmbv3r1GI+F6BBBAAAEEvC9Awt37fUSECCCAgCMCcuaVuWz7jTfeKN+pdL5B7EjoFIoAAggggAACCCAQc4E9e/Z069YtISFBcw4pOxDKonXNtx7Lli2rectNN90kpwTFvB1UiAACCCCAgLMCJNyd9aV0BBBAwJsC//rXv+RNXkMJd7m+ZcuW69at82aLiAoBBBBAAAEEEEAgBgLbtm3r2LGj7CuoOZO87rrrZLPBLGGUKlUq0rTzn//8ZwxipgoEEEAAAQRiKUDCPZba1IUAAgh4QmDRokWJiYmGsu0ZF8fHx3/wwQeeaANBIIAAAggggAACCLgnsGHDhrZt20ZawNGkSZPFixdnRlesWLFIM0+ZXi5ZssS9dlAzAggggAAC9guQcLfflBIRQAABLwts2rSpUKFCJrLtmbc8++yzUfbo9HLbiQ0BBBBAAAEEEEDARoHVq1fLG5CRJpbNmzf/9ddfpbrChQtHmXyWL1/++PHjNkZFUQgggAACCLgrQMLdXX9qRwABBGIqIAdeVaxY0Uq2PePe++6779y5czENncoQQAABBBBAAAEEPCmwbNmyW2+9VXOGKUvgW7VqlTdv3ujzzzZt2niyZQSFAAIIIICAGQES7mbUuAcBBBDwo8DZs2cbNGhgPdueUcLf/va3w4cP+9GBmBFAAAEEEEAAAQRsF1iwYEGjRo1MTzU/+ugj20OiQAQQQAABBFwRIOHuCjuVIoAAArEWkE1g7r33XtNfgTRvvOqqqzZv3hzrllAfAggggAACCCCAgFcFZs2aVbduXRNzzjx58vzxxx9ebRZxIYAAAgggYECAhLsBLC5FAAEE/Cvwj3/8w8Q3n2xvKVKkCOdc+fdTQeQIIIAAAggggIDtApcvX/7iiy+qV6+e7UwyywU1a9Zk00Lbu4MCEUAAAQRiL0DCPfbm1IgAAv8jYHT+/fHHHwOnKSAyRjHtvT537txTpkyhdxBAAAEEEEAAAQQQyBS4ePHiiBEjZKJoaObZo0cPDBFAAAEEEPC7AAl3v/cg8SPgVwFDM2+52GjCXXY70azCaDne9zWRcBccWXNUsmTJ+Ph4ox0R6TisIUOGeN+KCBFAAAEEEEAAAQRiIzBjxozChQubmGp+9dVXsYmQWhBAAAEEEHBIgIS7Q7AUiwAC2QgYnXzrTJT37t1bT8mScfZyD91xxx1ZWiHtihSwiYS7EvP06dO7du1avXr1/Pnzp02bJsdVvf7663379u3cufM999xz44031qhRo1SpUomJidnCPvbYY+np6V6GJTYEEEAAAQQQQAABpwVkW5iePXtmO3WMdIGk6ffs2eN0kJSPAAIIIICAcwIk3J2zpWQEEIgmYHQKrifh7kSZse9Fzd8MnEu462/gmTNndu/evWbNmgULFsi+nNIjsqr92Wef7dKlS6tWrZo0aSLbbj788MPsvKmflCsRQAABBBBAAIGACWzYsKFWrVpGp+VZrpc1H7IjTcBkaA4CCCCAQHgESLiHp69pKQLeEtC/gltP3MuWLTM3rY+SyNZTr+3XRFqubiVONY6eXy9sbxoFIoAAAggggAACCARbQCaZSUlJ5qblWe56+eWXg21F6xBAAAEEAixAwj3AnUvTEPC0gL0JdyvTeu9kn6P8bEDC3dOfZoJDAAEEEEAAAQTCLXD8+PG2bdtamZNnuTcuLm7x4sXhRqX1CCCAAAJ+FSDh7teeI24E/C5gY8Jd//moka6UTLcXPKN8RSHh7oUOIgYEEEAAAQQQQAABtcDSpUsrVKhgY7Y9o6hy5codO3YMcAQQQAABBHwnQMLdd11GwAgERMCuhLvmHixy6GgkJqPXx4w7+lcUEu4x6wgqQgABBBBAAAEEENApIDutDx48OD4+3vZse0aBclCQzki4DAEEEEAAAe8IkHD3Tl8QCQLhErAr4a5etB4l255BrJlzd3eRe6Sl95lKJNzD9edBaxFAAAEEEEAAAc8L7Nu37+abb3Yo1Z5Z7KhRozwvQYAIIIAAAgj8lwAJdz4QCCDgjoAtCXfN1Lme9khSPksA2abp9RRr7hp1MOrvLSTczdlyFwIIIIAAAggggIATAmvWrKlevXqxYsUKFSqUP39+OSs1V65csvG67fn33Llzr1u3zokmUCYCCCCAAAIOCZBwdwiWYhFAIBsBWxLu6lS1zsS05vGkrvSZBKxO/av/UWe7NJugbqx3zol1xZxKEUAAAQQQQAABBJwTSE9PT01NTUlJOXny5NGjRw8dOrR///49e/bs2LFjy5YtmzZtWr9+/dq1a3/77bdffvlFZqpyOOqPP/44b968OXPmfPvtt19//fWXX345derUyZMnf/rpp+PHj1+wYIFz0VIyAggggAACtguQcLedlAIRQECXgC0Jd/UKGv07w6h3cYl9Glq9Ql+iEj4S7ro+Q1yEAAIIIIAAAggggAACCCCAAAIIeEyAhLvHOoRwEAiNgPWEe6RstU5CzaXlOu+15bIoq+xJuNsiTCEIIIAAAggggAAC+gWM7gYT+9Uq+tvi7pWa+15G5wXT3S6jdgQQQMBeARLu9npSGgII6BWwnnC3mJV2fVeZKMvzLTYtSx+wpYzeDyXXIYAAAggggAACIRYg4a75BUFYjJ72RMI9xH9GNB0BBBD4HwES7nwOEEDAHQHrCXfre8JY2ZHGolr04Em4W+TldgQQQAABBBBAAAGjAm4l3E0fy2S0gVGuV0/ONTV0rkMn4W5j11AUAggg4EcBEu5+7DViRiAIAtYT7tbT5dZT9uZ6Itt6Sbibg+UuBBBAAAEEEEAAAdMCriTc1fNeCUP+0XQrjN6oGUB0imyrIOGeLREXIIAAAsEWIOEe7P6ldQh4V8Biwl3zfU/9J6ZmuLiymkZPpSTcvfvBJTIEEEAAAQQQQCCgAhbn5yZUIiWmY5Zw17mw3fpCnyw4bPlo4tPCLQgggICPBEi4+6izCBWBQAlYnNBrzs6NAqlz30b3ZzRao86TWkm4G4XlegQQQAABBBBAAAGLAhbn50Zrj7RhesxWuJvOtmdAGV3ro/Qh4W7008L1CCCAgL8ESLj7q7+IFoHgCFic0KsT7jJjNqqjM/1ttNhI1+uPmYS7XeaUgwACCCCAAAIIIKBTwOL8XGctmZdF2bYlBivc1StvMuJRr7+JsueM0SZnXk/C3TQdNyKAAAK+ECDh7otuIkgEAihgcUKvnvjaknA3UYjOvtFcwhPpXhLuOlW5DAEEEEAAAQQQQMAuAYvzc0NhRN8k3emEu2YOPfoXAc3l8KbfjiXhbujTwsUIIICA7wRIuPuuywgYgYAIWJzQ25Jwt2VfGp39YWjnRxLuOlW5DAEEEEAAAQQQQMAuAYvzc/1hZLuXi9MJd/XMXE/qXHNRvLmNZUi46/+0cCUCCCDgRwES7n7sNWJGIAgCFif06vmuicXpMUu4q79USNVRepGEexA+4rQBAQQQQAABBBDwlYDF+bnOtkbay0VZu6MJd83l7TqDN5epVxdOwl0nOJchgAACPhUg4e7TjiNsBHwvYHFCb8t5p7FJuKtDzfYrBAl333++aQACCCCAAAIIIOA3AYvzcz3N1TxCyd6pb7ZhqJPm0ZfCKAvU/PpgYpE7Cfdsu4kLEEAAAV8LkHD3dfcRPAI+FrA4ofdLwt1cnPZ+62BC7+O/E0JHAAEEEEAAAQRiJWBxfp5tmOpsdcYrqvZOfaOHYX3BjfrV1WwX06hDYn6e7aeFCxBAAAFfC5Bw93X3ETwCPhawOKE3l8jO4mV9wh29A0xvNG/vtw4m9D7+OyF0BBBAAAEEEEAgVgIW5+fRw1TPSKW6jFvsnfpGD8P6lwjTM3xlYMzPY/Whph4EEEDAHQES7u64UysCCFic0FufK0sX2PVOqGZvRlrCo6fr7f3WwYRejznXIIAAAggggAACIRewOD+PrqfeyCVzJxZ7p77Rw7C+Pl3zlwOju8owPw/53xrNRwCBwAuQcA98F9NABDwqYHFC7/GEe5QlPHr6w95vHUzo9ZhzDQIIIIAAAgggEHIBi/PzKHrqNLdy23R7p75G8/76N3DPLDl6c/R8ipif61HiGgQQQMC/AiTc/dt3RI6AvwUsTuidS7jbwqqeQxta9mLvtw4m9Lb0KYUggAACCCCAAALBFrA4P4+Ek2162t6pb5Q+smVxupSv/iZidBt35ufB/lOidQgggAAJdz4DCCDgjoDFCb3vEu7qt2gt/ov+DD4Tenc+4tSKAAIIIIAAAgj4SsDi/FyzrXpy075LuKsDlmYa6mrm54a4uBgBBBDwnQAJd991GQEjEBABixN6Eu4k3APyl0AzEEAAAQQQQAABbwhYnJ+rG6EzMR2AhLus4jfUhyTcDXFxMQIIIOA7ARLuvusyAkYgIAIWJ/TqebnRaa44ah6aaouv5vuqFpe0Z7mdhLstPUUhCCCAAAIIIIAAAhkCFufnWRjVM+1I03XfJdz1Ny3SR4uEO390CCCAQLAFSLgHu39pHQLeFbA4obcl4W5LIZrEJNy9+8kjMgQQQAABBBBAAAEtAYvzc2WRmpPhSOruJtxNHJpqfdUOCXf+BBFAAIFgC5BwD3b/0joEvCtgcUJvfV2J0JBw9+7ng8gQQAABBBBAAAEEYitgcX6uDFb9ZmeUtzNjlnCXCNWBGT3vVAoh4R7bDya1IYAAAv4TIOHuvz4jYgSCIWBxQm9o1UwkMVs2gneiO+z91sEKGif6iDIRQAABBBBAAIGACVicn2dqyNYxWYqKvorc3qlv9E5Rx+bKvpTMzwP2t0NzEEAAgSwCJNz5SCCAgDsCFif0DiXcTaxwcYLP3m8dTOid6CPKRAABBBBAAAEEAiZgcX6eoaFe0ZLtBNveqW/0TlHXJa3WfzZSRuGscA/YJ5/mIIAAArYLkHC3nZQCEUBAl4D1Cb2hN1U1YzK6+kZXw+y4yN5vHSTc7egTykAAAQQQQAABBAIuYH1+bu79UXunvtE7SXPVjoRtqGtJuBvi4mIEEEAghAIk3EPY6TQZAU8IODGhN3rkkfWUvUOU9n7rIOHuUDdRLAIIIIAAAgggECQBi/Nz08cj2Tv1zbZH1GtupOHZLsNXFqv+XUFKyLZe5QXMzw1xcTECCCDgOwFjTwXfNY+AEUDAswIWJ/TSLotTc1s2pXGI12LTskTFhN6hbqJYBBBAAAEEEEAgSAJW5ufqRd/690a3d+qbbY9ork/XmXOPdC8J92zZuQABBBAIlQAJ91B1N41FwEMCVib0Gc2wMq3XzNcbfZnUOU17v3WQcHeupygZAQQQQAABBBAIjIDp+bnFhSz2Tn31dIfmEvWM5msudddsoJJL/68LGeExP9fTTVyDAAII+FeAhLt/+47IEfC3gOkJvbLZVvaEUb9MauhNUkf17f3WwYTe0c6icAQQQAABBBBAIBgCpufn6tmmoWNI7Z366uwL9fcIK/9Cwl0nO5chgAACIREg4R6SjqaZCHhOwPSEXtkS9eIUnUlzzVUqer4YRFoOo+de/X1g77cOEu765bkSAQQQQAABBBAIrYDp+Xm2C8Ct5LIz7rV3sp3RxdajyizB6JuyzM9D+1dGwxFAICQCJNxD0tE0EwHPCZie0CtbormLop6mqvPmOmfJmvNynffqCSzjGhLu+q24EgEEEEAAAQQQQMAWAdPzc58m3AUtyt4ykdLx8gXE+lydhLstn1gKQQABBDwrQMLds11DYAgEXMD0hD6Li3pnmGzT35ppevnHbMUjfZewfcWN9Um8si1M6LPtWS5AAAEEEEAAAQQQMD0/92/CXTpdf/CZr9Kq0/R6vkowP+dPDAEEEAiPAAn38PQ1LUXAWwKmJ/RZmqGZPY+Sc9e8Xueui+o8uLRC572G9Em4G+LiYgQQQAABBBBAAAHrAqbn5/pz1qZ3cbF9gYuaS3OqrznbVyfcjYbHghjrH1dKQAABBLwsQMLdy71DbAgEWcD0hF6NEulVUPVKE/VyeEObQmrebnQ9i55OJeGuR4lrEEAAAQQQQAABBGwUMD0/D0bCXb+k+kuB/nszriThblSM6xFAAAF/CZBw91d/ES0CwREwPaHXJDC9WEZu1HnOqtSrrsWJ5e1SEQn34HzQaQkCCCCAAAIIIOATAXvn5/obbe/UV3+9pq/MAmXiGwEJd9P43IgAAgj4QoCEuy+6iSARCKCAvRN608tq9GfbNfei0X+7oS6091sHE3pD+FyMAAIIIIAAAgiEU8De+bl+Q3unvvrrNXel+kuBiW8EzM/N4XMXAggg4BcBEu5+6SniRCBoAk5M6I2ucze0G4zmxjUO9Yq93zqY0DvUTRSLAAIIIIAAAggEScCJ+bkeH3unvnpqtHKN9Q3cpXbm51a6gHsRQAAB7wuQcPd+HxEhAsEUcGhCH+mwI+svfqr3ajSxmEVnX9r7rYMJvU52LkMAAQQQQAABBMIs4ND8PFtSe6e+2VZn8QL1Eh8TBTI/N4HGLQgggICPBEi4+6izCBWBQAk4PaGPdD6qoVXtmeKaW9bIP/qiS5jQ+6KbCBIBBBBAAAEEEHBXwOn5eaTW+Sjhbst+MuLA/Nzdjzq1I4AAAk4LkHB3WpjyEUBAW8CtCb25/lDPreVlUnNFxf4uJvSxN6dGBBBAAAEEEEDAdwJuzc99lHBXr+kxtwSH+bnv/joIGAEEEDAkQMLdEBcXI4CAbQJuTejNNUC9V6O5lfLmard4FxN6i4DcjgACCCCAAAIIhEHArfm5XxLu6jhNL8Fhfh6GPyjaiAACYRYg4R7m3qftCLgp4NaE3lybrW8Bb65eW+5iQm8LI4UggAACCCCAAALBFnBrfm4x4a5eGZPREHNrzyN1sb07TDI/D/afEq1DAAEESLjzGUAAAXcE3JrQm2it3yfEfo/fRJdxCwIIIIAAAggggIBRAbfm5xYT7upTTOVfTK89j4SmrkXCNiqceT3zc9N03IgAAgj4QoCEuy+6iSARCKCAWxN6E5Tq7wAmCnHxFib0LuJTNQIIIIAAAggg4BcBt+bnVhLumgvP7V3erlmFbOZupVuZn1vR414EEEDA+wIk3L3fR0SIQDAF3JrQm9DMcjiSlcUsmrWnp6ebiEr/LUzo9VtxJQIIIIAAAgggEFoBt+bnVhLu6nulFRaz4coPgEP71TA/D+1fGQ1HAIGQCJBwD0lH00wEPCfg1oTeBESWUE2UEOWWb775plq1at999529xSpLY0LvnC0lI4AAAggggAACgRFwa35uJeGeZWVMRhM+/vjjbDslY4YcKTUfaeG8XbvDMz/PtoO4AAEEEPC1AAl3X3cfwSPgYwHNzRaj/KOeebMTHFKvMip7t4O8cOFC5cqVM8q//fbb161bZ6IJWSLUA+sWponWcQsCCCCAAAIIIIBAbAT8mHBXT311Lm+PnlKPMqO25SxWEu6x+UhTCwIIIOCWAAl3t+SpF4GwC+jJCyuvcStHnOU1Ultm2Jl9P2LECGUb4+LiunXrdvDgQUMfDhLuhri4GAEEEEAAAQQQQEBTwHcJd81psM7tH80l3O365JBwt0uSchBAAAFvCpBw92a/EBUCwRfwS8Jd+ZqqzvUyOjsvLS2tQIECaofk5OQhQ4akpqbqLIeEu04oLkMAAQQQQAABBBCIIuC7hLvmBus6u9howl1nHt907W6tLtIZMJchgAACCBgSIOFuiIuLEUDANgG7Eu6XL19+55135P+1LbIYFvTLL780btxYk+KKK66YMmWKnnaRcI9hj1EVAggggAACCCAQWIHYJ9xPnTr1008/md7DXb2Bu/60uP6Eu/4y9X8yWOGu34orEUAAAT8KkHD3Y68RMwII/EdgxYoV9evXl+8GY8aM8SmKpNSnTZtWsWJFzbR7o0aNfv75Z582jbARQAABBBBAAAEEfCQQy4T7pUuXPvjgA3nds3Tp0idPnjShpJkxN7T9o+aBq5kIji45J+Fuose5BQEEEPCRAAl3H3UWoSKAwP8KHDly5LHHHsuZM2fGnLho0aLHjh3zL9D58+fffPNNzR1mcuTI8eCDD+7atcu/rSNyBBBAAAEEEEAAAe8LxCzhvm7dOllWklndE088YQJH/Zan7DBjohy5pVOnTpnBJCQkyKFKTs+9Sbib6ynuQgABBPwiQMLdLz1FnAgg8B8BWQ4j0+siRYpk+Urw+OOP+93o8OHDPXr0iI+PV692z507d//+/U+fPu33NhI/AggggAACCCCAgDcFYpBwP3v27HPPPSdJbWVdsoZG3ls1aqLewN3cmvQtW7aop9+5cuXq3r37nj17jEal83oS7jqhuAwBBBDwqQAJd592HGEjEFKBlStXNmjQQHP3lXbt2unZ8dz7cH/88UeLFi0021iiRInRo0dfvHjR+60gQgQQQAABBBBAAAF/CTidcJ8zZ86VV16pnuXmzZt39uzZRq2ylCP7wxgtIeN62URe8zVTKT8xMbFnz5579+41V3KUu0i4205KgQgggICnBEi4e6o7CAYBBCIKyI4xsoY9cw8Z5Qy7atWq8+fPD5idfCGpUaOGZtq9du3a8+bNC1h7aQ4CCCCAAAIIIICAuwLOJdwPHDjwwAMPaM5s77vvvv379xttuL0J63Pnzg0fPrxkyZKaEcqbpk8++aSJIEm4G+1WrkcAAQQCI0DCPTBdSUMQCKyA7CEjZ6LKLu2ay2HeeOONtLS0QDY+PT39ww8/LF68uObUv2XLlhs3bgxkw2kUAggggAACCCCAQOwFnEi4Z+wGWahQIfWEtkKFCrNmzTLXzN69e2cp0Fw5yrtku5u333470txb0u5S6V9//WW9IinB3h8MbAmJQhBAAAEEbBQg4W4jJkUhgID9AqtWrWrYsKFmxrlt27bO7atof0vMlnjy5Ml+/frJC61qBNluslevXnJ+rNmyuQ8BBBBAAAEEEEAAgf8I2J5wl50SGzdurDmJfeaZZ86cOWOaXjaQURYrqXDTRWW5UaIaOnRosWLFNL+A5MmTp0+fPgcPHrRYHQl3i4DcjgACCHhcgIS7xzuI8BAIr8Dx48dlz8S4uDj1ZLdy5cpz584NFc2OHTvuv//+HDlyqDUKFiwoi3GCusw/VL1MYxFAAAEEEEAAARcFbEy4yyYtL7zwghw9qp67yoFMa9assdhM25e3Z4knJSVlyJAhRYoU0Uy7JyUl9e3b99ChQ6ZbQcLdNB03IoAAAr4QIOHui24iSATCJSBnn44fP17zdU6Z3b722mvnz58Pl8j/b+3SpUsjnRlbqVKl6dOnh5OFViOAAAIIIIAAAghYF9BMLkf5R9krRrNSOW0oywr0jEKSk5Pfe++9ixcvWgxV6lVGdccdd1gsMNLtp0+flq8ehQsX1kSQs17lPVTNl02zRKgHNhKmQ02jWAQQQAABRwVIuDvKS+EIIGBYQBa8/O1vf9Ocld577727du0yXGKwbpBfIyZNmlS+fHlNoiZNmvz222/BajGtQQABBBBAAAEEEIiFgJ68sPIadY5YFn136NBBs5zWrVvv27fPlmZIhl1ZhawWt6XYSIWcOnXqn//8p+Y29BJGvnz5+vfvf/ToUeXtJNwd7REKRwABBLwvQMLd+31EhAiEReDEiRNPPvmk5h4yV1999Zw5c8ICoaOd8pbuq6++mj9/fvX3mZw5cz788MN79+7VUQyXIIAAAggggAACCCDwHwErCXdZFDJ27FjNxeDlypX75ptvbFRWLp+X/7+NJUcpSs5VeuWVV2QvR00lmZYPGDDg2LFjGSWQcI9Np1ALAggg4FkBEu6e7RoCQyBEAjJB//TTT0uUKKGev8oeMoMHDw7tHjLRPwQHDhx49NFHNX+iELeXX37ZylFUIfr80VQEEEAAAQQQQACBf//bdMJ948aN8p6l+naZpv7jH/+Q/dADoysrhAYOHFigQAFNK9kz56WXXpKTqEi4B6bHaQgCCCBgToCEuzk37kIAAdsEfv/99xtuuEFzznrPPffs3LnTtpoCWtDatWtvu+02TcAyZcpMmDDh0qVLAW06zUIAAQQQQAABBBBwUyA1NVVSzJqHo9avXz+oWx3KSnZZz675sqnMyWUVvKyFlxXxbnYMdSOAAAIIuCpAwt1VfipHINwCMg3t3bt3fHy8OlksR4DOmjUr3DzGWj9z5swqVapopt3r1au3aNEiY8VxNQIIIIAAAggggAACUQUWLFhQuXJl9fxTtjV/5513rB+O6nF+2bdddm+XxmrOwGXPd9n5XfZ/93grCA8BBBBAwAkBEu5OqFImAghkIyB7yPzrX/8qWbKkenqaJ08eWRIii2VANCpw4cKFd999t0iRIpGOnN2yZYvRMrkeAQQQQAABBBBAAIEsAkeOHOnUqVOOHDnU0055RXXPnj3hEROKfv365c2bV3MGLpvav/baa6dPnw4PCC1FAAEEEBABEu58DBBAINYC69evv+mmmzSnpH//+9+3b98e64CCVZ/sGtmnTx/NF3vlH+U/yQXBajGtQQABBBBAAAEEEIiRgKybkR0LixYtqp7Mly1b9quvvopRHB6r5tChQ3379pVTlDS/48iCmCFDhgRpL3uP8RMOAggg4DkBEu6e6xICQiDAArK44+mnn9bcQ6ZixYqyKUqA2x7jpsli9latWkWa8b/33nuyHD7GIVEdAggggAACCCCAgK8F/vzzz1tuuUXzcNQnn3yS7VMOHjwoX3bkhV3NSXixYsXefPPNM2fO+PozQPAIIIAAAnoESLjrUeIaBBCwQeCzzz4rXbq0evaZO3fugQMHnjt3zoY6KOK/BRYuXCgbuGvO+GXDd37h4POCAAIIIIAAAgggoEfg/PnzsutjYmKiemJZt27dX3/9VU8hIbnmwIEDck5VpLR78eLF33777bNnz4ZEg2YigAAC4RQg4R7OfqfVCMRUYMOGDZprYWS+fuedd27dujWm0YSsskuXLslrv5o/dYj/bbfdtnbt2pCR0FwEEEAAAQQQQAABAwKLFi2qWrWqOtUuG5dL7jg9Pd1AWaG5dP/+/bLqX5YWaa59KVGixPDhw1lyFJqPAw1FAIHQCZBwD12X02AEYikgOxXKboYJCQnqiWaFChVmzJgRy2DCXJe8uyqvEWhuKxkXF9e1a1dZiRNmH9qOAAIIIIAAAgggoBY4evRoly5dNA9HlbOXdu3aBVp0gX379j3xxBOabwbI96NSpUqNGDEiNTUVRgQQQACBgAmQcA9Yh9IcBDwk8Pnnn5cpU0adapcZ54ABA3iPMvZdtXfv3ocffjhnzpzqTsmfP/+rr77KKpvYdwo1IoAAAggggAACHhSQw1EnTpwo246r543y6uQXX3zhwZg9G9KePXu6d++eK1cuzdXu4jly5EjZtMez8RMYAggggIBRARLuRsW4HgEEshfYtGmT7FWiOaFs3rz55s2bsy+CKxwTWLlyZZMmTTR7p3z58pMnT5bvV45VTsEIIIAAAggggAACXhfYsmWL5mRe1m307Nnz5MmTXm+AJ+OTFwK6deum+e6vzMzLli07atQo0u6e7DqCQgABBAwLkHA3TMYNCCAQRUC2Lnnuuec0l29IMvfLL79EzyMC06dPr1Spkmba/frrr1+2bJlH4iQMBBBAAAEEEEAAgZgJpKWlDR48WHPn8dq1a//8888xiySoFe3cufPRRx+NlHaXb0wfffSR9EJQm0+7EEAAgZAIkHAPSUfTTARiISDvlpYrV06dw5X8+/PPPy+5+FgEQR26BWQqL+dcFSxYUN1lslPn/fffv2PHDt2FcSECCCCAAAIIIICAvwWWLFlSvXp19cxQzgF68803L1y44O/meSn67du3d+7cOT4+XnP5ixx2NXr0aMC91GPEggACCBgTIOFuzIurEUBAU0B2ibn99ts154vNmjX7888/cfOswJEjR+QoJ83pvixukvcVeGvYs31HYAgggAACCCCAgC0Cx48ff+yxxzQPR73jjjtYhGELsrqQrVu3durUKVLavWLFimPHjiXt7hA+xSKAAAKOCpBwd5SXwhEIvoCcffrCCy/IOajqbLtsRDht2rTgEwSihRs3bmzZsqXmTybFixf/8MMP09PTA9FQGoEAAggggAACCCDwXwJyhE+JEiXU88CSJUtOnToVLKcFZOlShw4d4uLiNKfisgnkhAkTmIo73QuUjwACCNgrQMLdXk9KQyBcAl999ZW88KieGsqmhP369UtJSQkXh/9bO2/evFq1amnO9WvUqPH999/7v4m0AAEEEEAAAQQQQOA/Atu2bdN8S1UOR3388cdPnDiBVMwE5J3g9u3bR0q7X3XVVZ9++unFixdjFg8VIYAAAghYESDhbkWPexEIr8CWLVtatGihmZm99dZbZbl0eGl83nKZx8uWkZqrnKS7pdP/+OMPnzeR8BFAAAEEEEAAgbALyEYlQ4YMyZMnj3o+X7NmzWXLloUdyKX2y9eodu3ayQ8emt+zKleuPGnSJNLuLnUO1SKAAAIGBEi4G8DiUgQQEIFz5869+OKLmnvIlClTZsqUKSgFQOD06dP9+/eXPdzVc33ZZbJHjx6HDx8OQDNpAgIIIIAAAgggEEIByadLVl09zZP8++uvv86m4a5/JGSBy3333Rcp7V61atXPPvvs0qVLrsdJAAgggAACkQRIuPPZQAABAwJff/31FVdcobmHzDPPPCNZWgNlcannBXbt2vXAAw9oHp9VoECBoUOHnj9/3vONIEAEEEAAAQQQQACB/wjILjHdu3fXzOTK3jKywwxS3hFYt25dmzZtNKfi8nWsevXqssM+aXfv9BeRIIAAAkoBEu58HhBAQJeAzL8jHap58803s82ILkR/XvTzzz83atRI87XWK6+8Us7FvXz5sj9bRtQIIIAAAggggECIBCQ/K+egqid1xYsXl3NTQwThq6auXbu2VatWkdLu8qbCF198QdrdV11KsAggEAoBEu6h6GYaiYAVAdlD5uWXX9bcXaRUqVIyOyffaoXXF/dKF8tmQZovN8h3tsaNG//yyy++aAhBIoAAAggggAACIRTYsWPHHXfcoU61Sxq3a9eux44dC6GJv5q8evXqu+++O1LavXbt2tOnT+dLmb/6lGgRQCDYAiTcg92/tA4BqwLffvutrGLW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PHbr1s07DZGte5WpjUqVKl28eNE74REJAggggIBzAvfff7/y8dSiRQvn6tJfcpcuXZRRvf322/rv5UoEEEDA1wLyjpFyq/TKlSt7KqMtXxPq1KmjHKLHjRvna3CCRyC6AAl3Rz4hWbLY2f6fH3/8sSNxZFeo1KuM7YYbbsjuDqf++6ZNm5TPBtlrbPny5VJZlgizlZQL3MJ0ioZyEUAgxALyuo9y0y0ZJ42eLO00nhzfqhyZp06d6nSNlI8AAggg4LrA119/rRz85dzUXbt2uR6VBCAvgcmrYMrtzuSUby8ERgwIIICA0wJyopJyZH733XedrtFo+QsXLlRGKO8hnT592mghXI+AXwRIuDvSU3rywspr3MoR33HHHcowcuTI0adPn7S0NEdQsiv0lVdeUQZTs2bNCxcukHDPjo3/jgACQRbIcjBpr169vNba33//XZ4dmaO3vBzqtQiJBwEEEEDAXgH5MbhMmTLKefvIkSPtrcJKaY899pgytjfffNNKadyLAAII+EJAkidly5bNHP3y588v26Z7MPLWrVsrh+j+/ft7MEhCQsAWARLutjBmLcQvCXflBu6yqDwj7GuvvVY2QHTEJWqh58+fr1atmpJONlIg4R77jqBGBBDwiMCxY8cKFCiQOSrmyZPnr7/+8khsyjCy/HY7d+5cDwZJSAgggAACdglkyWj/7W9/89SuBbLWPleuXJlPTzkHRU5DsavtlIMAAgh4U+Dzzz9X5lI8uEwnw2379u3KvQ1y587tneOpvNmzROVfARLujvSdXxLuGY2X30Kvv/56ZcxNmzZ1xCW7Qn/66SflSknJLg0ePNhfmNk1kf+OAAII6BV44YUXlAPg008/rffO2F63aNEiZZy33XZbbOunNgQQQACB2An8+OOPyum65E02btwYu+r11dS9e3flg2nIkCH67uMqBBBAwK8Csj9w5rgno7Ts2evZlvTr1085RLdt29azoRIYAlYESLhb0QvIvX379lWOd7KgUn51dKttWZbMSOJGjlR1KxjqRQABBNwSOHz4sGyJmzk4582bV85BciuYbOtt2LCh8jmycuXKbG/hAgQQQAAB3wmcO3dO+YKsjPyyOMaDrZDzTpQrKIsUKcI2wR7sJkJCAAG7BFavXq2cit9+++12lexEObLXTYkSJZQBL1682ImKKBMBdwVIuLvr737t3333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EbjiiivUyUfeKmFTWurPHT58uMolG1SyD0TqBz1BHSThHvfBmjFjhpq1kdmE10H4GrN169bttttu6ix8ww03+CqBgxFAAAG/AldddZU67Vx55ZV+S8jO8aNHj1atTjrppOz0nZ4igAACwQm88MIL6uzatGlTdjbT15aUza677qoCvv/++/qncyQCCCBgICA7CTdv3tybeWQTMBYLlmeUB5I6deqkztUjR440kOcUBIIQIOEehKqzMmV63XPPPdXpY7/99lu/fr2zCrJR0L///W95LMBjlHdrfPnll9noOr1EAIEIBH7++eeGDRt6c478aLpgwYII2pGQKiWpIc8eeVzyFK380pyQttNMBBBAIKYCixYtynvQ/pFHHolpW+ParLxfLA4//PC4tpR2IYBASgTy3rpxzTXXpKRjQXZj/PjxasasdevWy5cvD7JCykZAV4CEu65UJMdddNFF6twhv3Z+//33kbQk6ZVecMEFquQBBxwgr1RNeqdoPwIIxFPg0ksvVScc7pUrDpMsRVHFzj333IqncAACCCCAQBmBvn37qvNqt27duPX1GzDye3DeY7Lvvvuu30I4HgEEENAXUOecOnXq8FiSJl3Pnj3Vjzz2hNB047CgBUi4By1sXr48ZS8v+fQmDvnzSy+9ZF5cts+U92lsueWW6iwsvx5nm4TeI4BAIALyhjr1Xc3yCP/ixYsDqSlFha5du1adojfZZBO2vE/R8NIVBBAIW0De9qTe9MqnEk8OmY3B3//+d1XykEMOMSuHsxBAAIGKAnkrtU8++eSKp3BATuC7776TbQy86Vq+Ssi7Z8FBIHIBEu6RD0HxBsyePXvTTTdV7/AuvvjimLY1Ic3K2yZYeEnoJGToaCYCSRLIe55myJAhSWp9dG2944471I+8QYMGRdcWakYAAQQSLLBixYptt91WnVGHDh2a4P5E2nR5LCBvd+AJEyZE2iIqRwCB1ArkLdPmkRpfIz1w4ED1g693796+TudgBIIQIOEehKptmfKez65du+a9bZnXZdiy/uc/J5xwgqp6yimn2JdJCQgggIAnILt+qcsrZB8webwGHx0BgWrWrJk3RcufodNx4xgEEEAgT+CSSy5Rb3f32msv3v9kEyTyhLHqedBBB9mUxrkIIIBAUQH5ElG7dm1vtpE3+QHlS0C+OOS9uaSqqspXCRyMgHMBEu7O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CCCAAAIIIIBAmALLli1r27atmoweNmxYmA0Ip67x48fXrl1b7ebNN98cTtXUoiNAwl1HiWMQQAABBBBAAAEEEEAAAQQQQAABBBBAINYC/fv3V9PQXbt2TevS79tvv13taa1atcaNGxfrsclS40i4Z2m06SsCCCCAAAIIIIAAAggggAACCCCAAAJpFKiqqqpRo4aXhq5Xr960adPS2NH/6dPGjRt79uyp5tw322yz77//Pq39TVa/SLgna7xoLQIIIIAAAggggAACCCCAAAIIIIAAAgj8l0B1dXX79u3VBPSQIUPSbST75+R1uUuXLmvWrEl3rxPROxLuiRgmGokAAggggAACCCCAAAIIIIAAAggggAACxQUGDRqkZts7duy4du3a1GN9/vnnDRs2VDt+/vnnp77X8e8gCff4jxEtRAABBBBAAAEEEEAAAQQQQAABBBBAAIHiAlOmTFFfIiobmk+aNCkjWE899ZSacJc/jxo1KiN9j203SbjHdmhoGAIIIIAAAggggAACCCCAAAIIIIAAAgiUE1i/fn3nzp3VpPOAAQMyRXbBBReo3W/QoMHUqVMzJRC3zpJwj9uI0B4EEEAAAQQQQAABBBBAAAEEEEAAAQQQ0BIYOnSomm5u167dypUrtc5My0Gyec6+++6rIuy4445Lly5NS/+S1w8S7skbM1qMAAIIIIAAAggggAACCCCAAAIIIIAAAjNmzKhfv76Xa65Ro8a4ceMyyPLDDz9svvnmas79hBNO2LhxYwYp4tBlEu5xGAXagAACCCCAAAIIIIAAAggggAACCCCAAAI+BCSh3K1bNzXL3K9fPx/np+vQN954QzavVzVuu+22dHUxMb0h4Z6YoaKhCCCAAAIIIIAAAggggAACCCCAAAIIIJATeOSRR9T8cqtWrRYtWpRlnFtuuUUFkRfJvv3221kGiarvJNyjkqdeBBBAAAEEEEAAAQQQQAABBBBAAAEEEDARmDt3btOmTdX88gsvvGBSUIrOkSX/xx57bN6PEAKVoi4moysk3JMxTrQSAQQQQAABBBBAAAEEEEAAAQQQQAABBHICxx9/vJpZlv9FRgSWLFmy/fbbqzL77bffunXrwAlTgIR7mNrUhQACCCCAAAIIIIAAAggggAACCCCAAAJWArKYXc0py1J31nF7oJ988on6IlmBuvjii624OdmnAAl3n2AcjgACCCCAAAIIIIAAAggggAACCCCAAAIRCchG7bJdu5pwl83cI2pLTKt9/PHHVR/587PPPhvTtqaxWSTc0ziq9AkBBBBAAAEEEEAAAQQQQAABBBBAAIE0CvTr10/NJnfr1k32Lk9jR636dO6556pKjRo1mjZtmlWJnKwtQMJdm4oDEUAAAQQQQAABBBBAAAEEEEAAAQQQQCA6gXHjxtWoUcNLJcveKTNmzIiuOfGtec2aNXvvvbeac995552XL18e3xanqGUk3FM0mHQFAQQQQAABBBBAAAEEEEAAAQQQQACBlAqsXLmyXbt2ahJ56NChKe2rg27NmjWrRYsWKtdJJ53E0wAOZCsVQcK9khD/jgACCCCAAAIIIIAAAggggAACCCCAAAJRCwwYMEBNH3fu3Hn9+vVRNyrW9Y8dO7ZmzZoq2t133x3rFqeicSTcUzGMdAIBBBBAAAEEEEAAAQQQQAABBBBAAIH0CkyaNKlWrVpe7rh27dpTpkxJb3ed9ezGG29UE+516tR55513nJVOQcUESLgTFwgggAACCCCAAAIIIIAAAggggAACCCAQX4G1a9d27NhRTRwPGjQovs2NU8s2bNjQo0cPlW6LLbb46aef4tTGtLWFhHvaRpT+IIAAAggggAACCCCAAAIIIIAAAgggkCaBIUOGqCnj9u3bV1dXp6mDgfZl4cKF2267rQp40EEHsRtPcOYk3IOzpWQEEEAAAQQQQAABBBBAAAEEEEAAAQQQsBKYNm1avXr1vHxxjRo1qqqqrErM3skfffTRJptsoubcr7jiiuwxhNRjEu4hQVMNAggggAACCCCAAAIIIIAAAggggAACCPgSkB1RunbtqmaK+/fv76sEDs4JPProoyqj/G7x4osvghOEAAn3IFQpEwEEEEAAAQQQQAABBBBAAAEEEEAAAQRsBYYNG6amidu2bbts2TLbQrN6fr9+/VTMJk2afP3111nFCLDfJNwDxKVoBBBAAAEEEEAAAQQQQAABBBBAAAEEEDATmD17dqNGjdQc8ZgxY8yK4iwRWL16dadOnVRPeRXtypUrwXErQMLdrSelIYAAAggggAACCCCAAAIIIIAAAggggIADge7du6vZ4VNPPdVBodku4ttvv910001V1dNPPz3bJO57T8LdvSklIoAAAggggAACCCCAAAIIIIAAAggggICNwBNPPKHm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8bTTE/j8888bNmyo5tzPP//8Mj577bWXd3CfPn0yIknCPSMDTTcRQAABBBBAAAEEEEAAAQQQQAABBBCIQED2Fenatauape3fv38E7aBKFwJPPfWUOpTy51GjRhUteOzYseqRHTp0cFF/Asog4Z6AQaKJCCCAAAIIIIAAAggggAACCCCAAAIIJFRg2LBhauK1bdu22Xl/ZkKHrHyzL7jgAnVAGzRoMHXq1MJTDjjgAPUweW/qihUrUgmS1ykS7lkYZfqIAAIIIIAAAggggAACCCCAAAIIIIBABAKzZ89u1KiRmngdM2ZMBO2gSncC8v7bfffdVx3THXfccenSpWoN77zzTt5CePlf+Ut3rYhvSSTc4zs2tAwBBBBAAAEEEEAAAQQQQAABBBBAAIH4CKxbt85vY7p3764mXk899VS/JXB8DAV++OGHzTffXB3ZE044YePGjV5T88Y9d+S9994bw744bxIJd+ekFIgAAggggAACCCCAAAIIIIAAAggggEAKBa677jo1qVqxh0888YSak23RosX8+fMrnsUBiRB44403atWqpY7vbbfdlmv5Rx99VLi8Xf7mjDPOSETXLBtJwt0SkNMRQAABBBBAAAEEEEAAAQQQQAABBBDIhIDsHCLvzNTsquTWJcOuJl5LvV1Ts0AOi5vALbfcoo5v7dq13377bWnkiSeeWDThvssuu8StC0G0h4R7EKqUiQACCCCAAAIIIIAAAggggAACCCCAQNoE6tev36ZNm+XLl+t07JRTTlGzrrLHiM5ZHJMgAXnc4dhjj1VHuVWrVpJzl/ejFk24y4r4lStXJqiDZk0l4W7mxlkIIIAAAggggAACCCCAAAIIIIAAAghkSGDhwoW5LOqVV15ZsdvyZlQ15SrvTZW3p1Y8iwMSJ7BkyZLtt99eHeu8vd3zMu/vvfde4vrot8Ek3P2KcTwCCCCAAAIIIIAAAggggAACCCCAAAKZE/j0009zydO6det+9dVXZfq/bNmytm3bqpnWYcOGZc4rMx3+5JNP5NGHokvaC//yL3/5S+phSLinfojpIAIIIIAAAggggAACCCCAAAIIIIAAArYCr7zyipc/PeKII8oU179/fzXT2rVr1w0bNthWz/kxFhg5cqRmwr1v374x7oebppFwd+NIKQgggAACCCCAAAIIIIAAAggggAACCKRY4OGHH1aTqqNHjy7a2aqqqho1anhH1qtXb9q0aSlmyWbX1q1bN2XKlBEjRpx//vldunTZZJNNNBPuHTt2TL0YCffUDzEdRAABBBBAAAEEEEAAAQQQQAABBBBAwFbg2muvVZOq22677erVq/MKra6ubt++vXrYkCFDbCvm/BgIrF279uOPP3700UfPO++8ffbZR35H0cyw5x1Wu3btVatWxaBDATaBhHuAuBSNAAIIIIAAAggggAACCCCAAAIIIIBAOgT69euXlzy98cYb87o2aNAg9RhZziyJ2nR0P2u9WLNmzUcffSSPNZxzzjl77bWXbNxvlmEvPGvixInpxiThnu7xpXcIIIAAAggggAACCCCAAAIIIIAAAgg4EDjssMPykqfyqsxZs2Z5RcseI7J+2TumVq1akyZNclAxRUQhsHTp0ltvvbVly5au8uxeOffdd18UHQqvThLu4VlTEwIIIIAAAggggAACCCCAAAIIIIAAAgkV2HnnnQtzryeeeGKuO+vXr+/cubN6wIABAxLaU5rtCcj2L/fee2/btm0dpt3PPPPMdAuTcE/3+NI7BBBAAAEEEEAAAQQQQAABBBBAAAEEHAg0atSoaNb19ddfl9KHDh2q/mu7du1WrlzpoFaKiIGA7As0fPjwHXbYwUnafffdd49BnwJsAgn3AHEpGgEEEEAAAQQQQAABBBBAAAEEEEAAgRQILFmypFSyVVa+T5s2TbaX8Q6oUaPGuHHjUtBruqAK/Prrr08//bTsy2+Zdpd9hwpft5smahLuaRpN+oIAAggggAACCCCAAAIIIIAAAggggIB7gc8//7xMmnX77bdX/1Ver+q+BZQYD4GNGzf+4x//2GeffWzS7une3J+EezxClVYggAACCCCAAAIIIIAAAggggAACCCAQV4GxY8dqJlhbtWq1aNGiuPaDdjkTkK2EDjroIM2oyDvsgQcecNaO+BVEwj1+Y0KLEEAAAQQQQAABBBBAAAEEEEAAAQQQiJOAbOGtmVq94447Fi5cGKe205YABd59990ePXrIJkKa4ZE77A9/+EOAbYq6aBLuUY8A9SOAAAIIIIAAAggggAACCCCAAAIIIBBvgRtuuMFXRrVBgwY77rjjwQcffMYZZwwePFhWNP/zn//8+OOP58+fL3uSxLuvtM63gIxsr169atasqRkknTp18l1Hck4g4Z6csaKlCCCAAAIIIIAAAggggAACCCCAAAIIRCEgS5I1c6kVD5N3Zm633XYHHnjg6aef/v3330fRG+oMRODLL7+U31dkfCvGQJ06daqrqwNpRAwKJeEeg0GgCQgggAACCCCAAAIIIIAAAggggAACCMRYoHv37hWzqL4O2GmnnV577bUY95imGQrMnDmzf//+9erVKx8PH374oWEFsT+NhHvsh4gGIoAAAggggAACCCCAAAIIIIAAAgggEKnArrvu6iufXubgxo0b33777WvXro20Q1QerMC8efMuu+yyhg0bloqEhx56KNgWRFc6Cffo7KkZAQQQQAABBBBAAAEEEEAAAQQQQACBJAg0bdrUPuEur9bs06ePpGKT0GPa6EBgwYIF1157bbNmzQqD55xzznFQQSyLIOEey2GhUQgggAACCCCAAAIIIIAAAggggAACCMRDYPny5fbZdnlP5jvvvBOPDtGKUAWWLl166623tmzZUo2izp07h9qIECsj4R4iNlUhgAACCCCAAAIIIIAAAggggAACCCCQNAF5GaZNwr158+YPPPDAr7/+mrR+016XAqtWrbr33nvbtm2bi6W6deuuWbPGZQWxKYuEe2yGgoYggAACCCCAAAIIIIAAAggggAACCCAQP4Fx48aZJdxr1qx57rnnyr4i8esTLYpGQPbuHz58+A477CARNXny5GgaEXCtJNwDBqZ4BBBAAAEEEEAAAQQQQAABBBBAAAEEkizw2GOPGSTcu3btmtaMapIHMxZtl8cdnn76afkhJxatcd0IEu6uRSkPAQQQQAABBBBAAAEEEEAAAQQQQACBFAncdNNNvhLurVq1evzxxzdu3JgiA7qCgK4ACXddKY5DAAEEEEAAAQQQQAABBBBAAAEEEEAggwKyLYxmwr1OnTqXXnqpvCQzg0p0GYGcAAl3IgEBBBBAAAEEEEAAAQQQQAABBBBAAAEESgocddRROgn3Qw455IsvvsARgYwLkHDPeADQfQQQQAABBBBAAAEEEEAAAQQQQAABBMoJ7L777uUT7ltvvfULL7wAIgIIiAAJd8IAAQQQQAABBBBAAAEEEEAAAQQQQAABBEoKNG/evFTCfZNNNrnmmmtWrVoFHwII5ARIuBMJCCCAAAIIIIAAAggggAACCCCAAAIIBCWgsxmLeswjjzwSVFOMypVkeqkuHHvssd9++61RqSYniUzSMU26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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Once you create a static Segment tree the update and the query operation should be easy.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Can we avoid the extra space incurred and rather use the given array elements as the nodes to hold the sum in a range.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Infact a famous data structure Binary Index Tree(also known as Fenwick tree) works on the same principle and is relatively simple 
to code and debug.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So how do one assign the parent child relationship in the tree. Since now there are no internal node to hold the sum of a range like (0,4) we can infact use the 4th index to hold the sum of (0, 4), the same is true for the&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;3 holding the sum of (3,3)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;10 holding the sum of (9,10) &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;12 holding the sum of (9,12)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;16 holding the sum of (0,16)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So to generalize each index index holds the sum of elements in range&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;((index - 2^r + 1) , index) where r is the right most bit postion set in index&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;I would strongly suggest to go over the above logic once more and write a pseudo code for the update query.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Kudos if you were successful to write the working piece of the code.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So how do we add a delta to a index, we need to update all the elements which are using its value.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Also to extract the rightmost bit we can use&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;n &amp;amp; -(n)&amp;nbsp;&amp;nbsp;&amp;nbsp; //Proof is left to reader :)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Below is the terse piece of code which updates the delta at a particular index&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;void update(int index ,int delta){
   while (index &amp;lt;= N){             // N is the total number of elements in the array
       A[index] += delta;
       index += (index &amp;amp; -index);
   }
}
&lt;/pre&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;To initialize the array we can intialize all the array elements to 0 and iteratively call the update function for each of the index.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;To find the sum of elements in the range (0, index), the below function can be used&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int query(int index){
 int sum = 0;
 while (index &amp;gt; 0){
  sum += A[index];
  index -= (index &amp;amp; -index);
 }
 return sum;
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;To find the sum in a given range (a,b), we can compute it by&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int sum = query(b) - query(a-1);
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Finally the time complexity of each of the update, query is O(log2(N)) &lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/4826512358979884975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/06/cumulative-sums-of-elements-in-array.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/4826512358979884975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/4826512358979884975'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/06/cumulative-sums-of-elements-in-array.html' title='Cumulative Sums of elements in an array[Binary Indexed Tree]'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-18213737203502610</id><published>2013-02-23T16:53:00.005+05:30</published><updated>2015-03-21T13:13:50.760+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Fibonacci Series Part II</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
In the &lt;a href=&quot;http://coders-stop.blogspot.in/2013/02/fibonacci-numbers.html&quot;&gt;last post&lt;/a&gt; we discussed about evaluating the nth Fibonacci number in logarithmic time O(logn).&lt;br /&gt;
&lt;br /&gt;
Lets us look at another problem on the similar lines.&lt;br /&gt;
Given a series&lt;br /&gt;
F(n) = F(n-1) + 2*F(n-2) + 3*F(n-3) + F(n-4)&lt;br /&gt;
&lt;br /&gt;
Lets try to solve the problem in the similar fashion,&lt;br /&gt;
&lt;br /&gt;
The matrix multiplication looks like below,&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt; &lt;br /&gt;
&lt;br /&gt;
The running time to compute the nth term of the series will be&amp;nbsp;&lt;/div&gt;
(sizeof(M) ^3) * log(n) = 64*log(n)&lt;br /&gt;
&lt;br /&gt;
Can we optimize it further ?&lt;br /&gt;
&lt;br /&gt;
Lets again go over the series once more&lt;br /&gt;
F(n) = F(n-1) + 2*F(n-2) + 3*F(n-3) + F(n-4)&lt;br /&gt;
F(n-1) = F(n-2) + 2*F(n-3) + 3*F(n-4) + F(n-5)&lt;br /&gt;
F(n) - F(n-1) = F(n-1) + F(n-2) + F(n-3)&amp;nbsp; - 2*F(n-4) - F(n-5)&lt;br /&gt;
After some more rearrangement it reduces to&lt;br /&gt;
F(n) = 2* F(n-1) + F(n-2)&lt;br /&gt;
Some of you must have recognized it as Pell&#39;s number.&lt;br /&gt;
&lt;br /&gt;
So the matrix multiplication reduces to&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt; &lt;br /&gt;
So the final runtime reduces to O(8* log(n)) &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/18213737203502610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/02/fibonacci-series-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/18213737203502610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/18213737203502610'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/02/fibonacci-series-part-ii.html' title='Fibonacci Series Part II'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-8939594921283646861</id><published>2013-02-23T01:58:00.003+05:30</published><updated>2015-03-21T13:14:50.577+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Fibonacci numbers [Matrix exponentiation]</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Fibonacci numbers has been a very famous sequence represented as:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;F(n) = F(n-1) + F(n-2)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;with F(0) = 0, F(1) =1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So what if you need to find the nth term of the series. Its easy to view the recursive nature of the problem.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The code snippet would look something like&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int fib(int n) {
    if(n&amp;lt;1) return 0;
    if(n == 1) return 1;
    return fib(n-1) + fib(n-2);
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Lets try to analyse the sequence of calls for calculating the F(4)&lt;/span&gt;&lt;br /&gt;
&lt;img alt=&quot;enter image description here&quot; src=&quot;http://i.stack.imgur.com/CLwKE.jpg&quot; height=&quot;225&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Clearly
 we are computing the same value over and over, and the size of 
computations will grow exponentially with the increasing value of n. Can
 we reuse the same value computed before ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Yes, infact we term this as a technique called memorization or Dynamic programming.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The trick is to store the values as you compute and look up the value before computing it.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The iterative solution to compute the nth Fibonacci is as follows&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int fib(int n) {
    if(n &amp;lt; 1)
        return 0;
    int *a = malloc(sizeof(int) * (n+1));
    a[0] = 0; a[1] = 1;
    for(int i = 2; i &amp;lt;= n; i++)
        a[i] = a[i-1] + a[i-2];

    return a[n];      
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The above implementation reduces the time complexity to O(n) with a overhead of the O(n) space.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Can we still do better ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Is it necessary to generate all the previous Fibonacci numbers ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Let&#39;s try to rearrange the formulas to generate the series&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;F(2) = F(1) + F(0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;F(3) = F(2) + F(1) = 2*F(1) + F(0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;F(4) = F(3) + F(2) = 3*F(1) + 2*F(0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;It appears that every term in the series can be broken down to a form of&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;F(n) = p*F(1) + q*F(0)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So the task boils down to find the p &amp;amp; q for a particular given &#39;n&#39;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&amp;nbsp;Its easy to realize that the subsequent terms can be generated using the matrix multiplication.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=809349266944482554&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;cursor: move;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;So we can calculate the nth Fibonacci number as&lt;/span&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Can we evaluate the power(a,b) in sub-linear time ?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;The answer is yes, we will be using the same technique again of reusing the old values computed before.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;May be the old computed values concept may not be straightforward.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Lets take a closer look on how to calculate power(a,.b)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;power(a, b) = a*a*a*a*.........*a (b times)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;can you figure out the overlapping solutions.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;We can rewrite the above equation as&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;power(a,b) = power(a,b/2) * power(a, b/2)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If b is even&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;power(a,b) = power(a,b/2) * power(a,b/2)&amp;nbsp; * a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If b is odd&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;By now you would have realized that the number of multiplications required will be ceil(log(b))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;(where log is evaluated in base 2)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Using the same approach we can evaluate the power(matrix M, n)&amp;nbsp; and number of operations needed will be&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;(sizeof(M) ^3) * log(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;In our case it will be 8* log(n)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Hence the nth 
Fibonacci number can be calculated in O(log(n)). Writing the code 
snippet for the same is left as an exercise to the reader.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;&quot;&gt;Comments invited :)&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/8939594921283646861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/02/fibonacci-numbers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8939594921283646861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8939594921283646861'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/02/fibonacci-numbers.html' title='Fibonacci numbers [Matrix exponentiation]'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-922373329025315347</id><published>2013-01-14T13:20:00.002+05:30</published><updated>2015-03-21T13:16:17.860+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>[Google Interview] Query the most frequent element</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Design a data structure which supports the below operation&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Insertion of an integer&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Deletion removes the element with highest frequency at that instant. In case of tie, go by the FIFO startegy.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;For e.g&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Insert 5,6,5,7,5,7&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;1st removal -- 5,6,5.7,7&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;2nd removal -- 5,6,5,7,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;3rd removal -- 5,6,7&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;and so on &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Perform both the operations in O(1).&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/922373329025315347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2013/01/google-interview-query-most-frequent.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/922373329025315347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/922373329025315347'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2013/01/google-interview-query-most-frequent.html' title='[Google Interview] Query the most frequent element'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-5498592531399481682</id><published>2012-09-23T23:18:00.003+05:30</published><updated>2015-03-21T13:18:22.022+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><title type='text'>[Amazon Online test] Number of swaps required</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;color: #444444; font-size: 16px; line-height: 25px;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;Given an array containing 0 &amp;amp; 1 only, You have only 1 operation i.e. you can&lt;/span&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt; swap the&lt;/span&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;adjacent elements in the array. Find the minimum number of operations&lt;/span&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;required to sort the given input array.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;A = (0,0,1,0,1,0,1,1)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #444444; font-family: &#39;Lucida Grande&#39;,Tahoma,Arial,sans-serif; font-size: 16px; line-height: 25px;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;Min Operations: 3.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;Approach:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&amp;nbsp;Let&#39;s start with some of the trivial test cases.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;(1,0) -- Number of swaps = 1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;(1,1,0) -- Number of swaps = 2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;(1,1,0,0) -- Number of swaps = 4 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;So an important observation comes that given an array of the type&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;(1, 1, 1, ... n times, 0, 0, 0, .. m times)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;Number of swaps = n*m (This is based on the fact that each 0 has to be pushed(swapped) back m number of time)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;So iterate over the array and keep track of the 1&#39;s encountered, whenever we hit a 0 we add the result(number of swaps) with the &lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;number of 1&#39;s encountered so far(as 0 has to be swapped with each of them order to reach a configuration like (0,0,..., 1, 1, 1...))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;Now the piece of code will look like&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit; margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&lt;span style=&quot;font-family: inherit; margin: 0px 0.3em 0px 0px; padding: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int swapSort(int *a, int n) {
  int swaps = 0;
  int noOfOne = 0;
  for (i =0;i&amp;lt;n;i++) {
    if (a[i] == 1) 
      noOfOne++;
    else
      swaps += noOfOne;
  }
  return swaps;
}
&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/5498592531399481682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/09/amazon-online-test-number-of-swaps.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5498592531399481682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5498592531399481682'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/09/amazon-online-test-number-of-swaps.html' title='[Amazon Online test] Number of swaps required'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-7908626267855294175</id><published>2012-09-23T23:14:00.002+05:30</published><updated>2015-03-21T13:22:18.344+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><title type='text'>[DirectI Online test] Number of substrings containing atmost 2 different characters</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given an input string, find the number of substrings which contains atmost two different characters. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;E.g - aabc Ans: 8&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;&lt;u&gt;Approach:&amp;nbsp;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Lets start with a simple approach, &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif;&quot;&gt;The most naive solution would be to iterate over all the possible substrings of the array&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif;&quot;&gt;(~ n ^ 2) and then validate if the substrings have atmost two unique characters.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif;&quot;&gt;The complexity will go over to O(n^3), proof is left to the reader.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Can we do it better, indeed yes, &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;An important observation is that we should break when we have the distinct characters greater than 2 and we should not be computing the further substrings with the same prefix.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Also  we need not find the distinct characters in each substring, rather we can just compute the largest length substring with a starting index with atmost 2 different characters, and length of the substring found is number of substrings which can be formed staring for a given index.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;For e.g. aabbac&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;For the 0th index the aabba is the longest substring with atmost 2 different characters,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;and indeed the number of strings which can be formed starting with 0th index is 5&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;which are a, aa, aab, aabb, aabba.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The above approach can be implemented by summation of the largest substrings of atmost 2 characters possible with each index element &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The complexity boils down to O(n^2)&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Can we still do better ?&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;A little pen and paper work will make us realize that there are lot of computations which are done repeatedly.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Once we know that the largest substring starting at index i is substring (i,j) that contains at most 2 elements.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Now to figure out the largest substring for the index i+1, should we again compute from i&amp;nbsp;+ 1 to j, but infact we just computed in previous iteration so why not store the result and use it back. This technique is often termed as&amp;nbsp;memorisation&amp;nbsp;in the computing terms.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif;&quot;&gt;So the algorithm looks like&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Keep track of the characters and their count till the distinct characters are less than 2 &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;At each&amp;nbsp;successive&amp;nbsp;iteration we need to remove the last previous index from the tracking list.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Return the result as the sum of the largest substrings formed at each index.&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The running time complexity reduces to O(n)&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Below is a implementation of the above logic in C &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int isInArray(int a[2][2], int n, int k) {
&amp;nbsp;&amp;nbsp; if(n &amp;gt; 2) return -1;
&amp;nbsp;&amp;nbsp; if(n == 1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[0][0] == k) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[0][1]++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[1][0] = k;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[1][1] = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; } else if(n == 2) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[0][0] == k) {a[0][1]++; return 2;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[1][0] == k) {a[1][1]++; return 2;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;
&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp; return -1;
}
int removeFromArray(int a[2][2], int k) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[0][0] == k) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[0][1]--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[0][1] &amp;lt;= 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[0][0] = a[1][0];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[0][1] = a[1][1];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } else if(a[1][0] == k) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a[1][1]--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[1][1] &amp;lt;= 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 

}
int numberOfSubstrings ( string A ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len = A.length();
&amp;nbsp;&amp;nbsp;&amp;nbsp; int res = 0, j = 1, c = 1, a[2][2];
&amp;nbsp;&amp;nbsp;&amp;nbsp; a[0][0] = A[0]; a[0][1] = 1; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i=0;i&amp;lt;len;i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (;j&amp;lt;len; j++) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = isInArray(a, c, A[j]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(c == -1) break;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = removeFromArray(a,A[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = (res + j-i);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return res;
}
&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/7908626267855294175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/09/directi-online-test-number-of.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7908626267855294175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7908626267855294175'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/09/directi-online-test-number-of.html' title='[DirectI Online test] Number of substrings containing atmost 2 different characters'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-5512618904758272640</id><published>2012-03-22T12:16:00.005+05:30</published><updated>2015-03-21T13:23:32.372+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><title type='text'>[Amazon Interview] Compare the BSTs</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given two unsorted integer arrays, your task is to compare the BST formed by both the arrays.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;e.g [3 2 1 4 5] &amp;amp; [3 4 2 5 1]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;when the BST is formed by taking the elements from the left, both BST turn out to be same.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;nbsp; \&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 &amp;nbsp; &amp;nbsp; 4&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; /&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp; &amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Expected time complexity O(n).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;Approach:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;First observation is that the first element of the array forms the root of the BST.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;So the first element needs to be equal of both the arrays.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Now the next left element which gets added to the BST is the next smaller element in the array, and same is true for the next right element in the BST.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;So the sequence of the elements of the less than the the first element should be same in both arrays&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;And the same is true for the elements greater than the root element&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;So if the first array contains elements {9, 14, 8, 11, 4, 7, 15, 10, 6}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;so any array which forms the same BST should have the elements of the sort&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;{9, ., 14, ..,11, .., 15, .., 10} &amp;amp; {9, .., 8, .., 4, .., 7, .., 6}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Both the preconditions can be verified trivially by two scans over the arrays.&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/5512618904758272640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/03/compare-bsts.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5512618904758272640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5512618904758272640'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/03/compare-bsts.html' title='[Amazon Interview] Compare the BSTs'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-2836486505216890607</id><published>2012-02-08T11:49:00.000+05:30</published><updated>2014-11-04T22:41:47.001+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><title type='text'>[Amazon Online Test] : Finding the inorder successor</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given a binary search tree with the following node structure&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;struct tree {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int data;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct tree *left;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct tree *right;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct tree *next;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;};&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The next pointer of each node is pointing to null.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Write a code to initialize the next pointer of each node to its inorder successor.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Approach:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Traverse in the BST in reverse inorder manner(i.e. postorder) and initialize the inorder successor as the last element visted.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Below piece of code initializes the next element to the inorder successor.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;void inorder_successor(struct node * root) {
     static struct node * current = NULL;
     if(root == NULL)
         return;
     inorder(root-&amp;gt;right);
     root-&amp;gt;next = current;
     current = root;
     inorder(root-&amp;gt;left);
     return;
}
&lt;/pre&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/2836486505216890607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/02/amazon-online-test-finding-inorder.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2836486505216890607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/2836486505216890607'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/02/amazon-online-test-finding-inorder.html' title='[Amazon Online Test] : Finding the inorder successor'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-5366198684691962889</id><published>2012-02-02T00:06:00.000+05:30</published><updated>2015-03-21T13:24:04.642+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Euler problem : Finding the minimum sum</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by &lt;b&gt;only moving to the right and down&lt;/b&gt;, is indicated in bold red and is equal to 2427.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;img align=&quot;middle&quot; alt=&quot;&quot; src=&quot;http://projecteuler.net/images/bracket_left.gif&quot; height=&quot;120&quot; width=&quot;8&quot; /&gt;&lt;/td&gt; &lt;td&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;131&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;673&lt;/td&gt;&lt;td&gt;234&lt;/td&gt;&lt;td&gt;103&lt;/td&gt;&lt;td&gt;18&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;201&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;96&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;342&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;965&lt;/td&gt;&lt;td&gt;150&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;630&lt;/td&gt;&lt;td&gt;803&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;746&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;422&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;111&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;537&lt;/td&gt;&lt;td&gt;699&lt;/td&gt;&lt;td&gt;497&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;121&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;956&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;805&lt;/td&gt;&lt;td&gt;732&lt;/td&gt;&lt;td&gt;524&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;37&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;331&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt; &lt;td&gt;&lt;img align=&quot;middle&quot; alt=&quot;&quot; src=&quot;http://projecteuler.net/images/bracket_right.gif&quot; height=&quot;120&quot; width=&quot;8&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;This can be solved by an easy application of the DP.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;A nice variation of the&amp;nbsp; above problem is to find the minimal path sum from the top left to  the bottom right, by moving left, right, up, and down, is indicated in  bold red and is equal to 2297.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;img align=&quot;middle&quot; alt=&quot;&quot; src=&quot;http://projecteuler.net/images/bracket_left.gif&quot; height=&quot;120&quot; width=&quot;8&quot; /&gt;&lt;/td&gt; &lt;td&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;131&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;673&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;234&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;103&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;18&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;201&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;96&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;342&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;965&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;150&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;630&lt;/td&gt;&lt;td&gt;803&lt;/td&gt;&lt;td&gt;746&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;422&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;111&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;537&lt;/td&gt;&lt;td&gt;699&lt;/td&gt;&lt;td&gt;497&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;121&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;956&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;805&lt;/td&gt;&lt;td&gt;732&lt;/td&gt;&lt;td&gt;524&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;37&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span style=&quot;color: #dd0000;&quot;&gt;&lt;b&gt;331&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt; &lt;td&gt;&lt;img align=&quot;middle&quot; alt=&quot;&quot; src=&quot;http://projecteuler.net/images/bracket_right.gif&quot; height=&quot;120&quot; width=&quot;8&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/5366198684691962889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/02/euler-problem-finding-minimum-sum.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5366198684691962889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/5366198684691962889'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/02/euler-problem-finding-minimum-sum.html' title='Euler problem : Finding the minimum sum'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-8807801376597087832</id><published>2012-01-24T23:57:00.002+05:30</published><updated>2014-02-23T10:52:50.446+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Puzzle"/><title type='text'>Euler Problem: Pandigital number</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Multiplying 9 by 1, 2, 3, 4, and 5, gives the pandigital, 918273645, which is the concatenated product of 9 and (1,2,3,4,5).&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;What is the largest 1 to 9 pandigital 9-digit number that can be formed as the concatenated product of an integer with (1,2, ... , n) where n &amp;gt;1?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Its fun to solve the problem without the use of code :)&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/8807801376597087832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/01/euler-problem-pandigital-number.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8807801376597087832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/8807801376597087832'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/01/euler-problem-pandigital-number.html' title='Euler Problem: Pandigital number'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-3937995031067377520</id><published>2012-01-21T13:21:00.001+05:30</published><updated>2015-03-21T13:24:40.176+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Online Test"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Trees"/><title type='text'>[Amazon Online Test] Find the nodes at k distance.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given a tree with the root and a particular node, find the nodes which are atmost at a distance of k from the particular node and print them in sorted order.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;Approach:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=3418265334198879901&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;data:image/png;base64,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OPBMof3798NC4Yp6I/NzRBQKhmolpUmMQ4r19fXffvutRqMJCQmBzEyXnJg56PX6ZcuWjRkzZuvWrTgppNBK82dqUihUKylKjAsYwS+Gv3/++adKpXrmmWe65uTMAAc6XVxc7O3ti4qK8FNYK/GalBSKmVCtpJgAyyXICmysqanZvn17aGhoUFAQx3Hx8fHIjOUcugS9Xp+YmChJ0rx582BSkKIglPyAXXSOlL8ZVCspSvDaXoiI6BUWFq5Zs+aJJ574v//7v7Vr1zo6Ok6dOvXO9MHh/L29ve3t7V977bVdu3bduHEDNaxvrkivU62kmAnVSoppcN65pqbm0KFDixYt+r//+79Bgwa9/fbbeXl5zz//vFqtTktLg9Vl7yhkWd63b59areY4TqvVjho1KiQk5NSpU9gEtnh2JuVehmolRQleeREhVF5evm3bNhcXFysrK0EQYmNjb968KctyYmIix3He3t5de6omqaysnDBhgiiKn3/++RtvvPH000/36dNn5syZqampRUVFioUoaP8hiplQraSYRpbls2fPrlixYtCgQQ888MC8efP27dtHCo2fnx/HcbGxsV17nsbExMQIggAF85cuXdqyZYuXl9cjjzzi6Oi4du3a3NxcaJpJfXBKq6Baea9DOqQghfX19fX19WlpaX5+ft27dx86dGhkZOT58+fJ/fV6/fnz56HdWV5eHj4ariTvHHtN8S4GgyE/P5/jOEmScnJy4NnKysqMjIzXX399yJAhdnZ2L730UlJS0u3bt5FR/03spN+ZCStK10K18p5GUWcO4nLjxo2oqChYjdbDwyMuLg4UEDWIC1aoiIgIlmX9/PwqKytx4NKyBsAWg7W+tra2vLzcy8tLo9F8+OGH8CxutVlaWhobG+vm5ta/f39JklatWnXhwgXYh8ySm7OOEOXehGrlPQ256Db8PXbs2OLFi/v37z9w4MCgoKDjx4/DnlDOjf1WrJ5z5szheT40NBQfEzS3EzInxrr27rvvqlSqF154ARndBurq6srLy/fv3//yyy8PGTJkwIABQUFBP/zwQ2VlJWpsCJuceUmhUK28p8GiUFtbq9PpvvvuO3d39549ezo5OX344YcFBQWooRSRXIURv6qmpqagoMDFxUWSpKVLl3ZVngSm34SEhKhUKnd399LSUizlxinvP//88/PPP3d1dR0wYICz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&quot; style=&quot;cursor: move;&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Lets say the given tree is&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;And the given node is of the value 50, and distance k = 3&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Then the desired result is 5, 30, 50, 70, 90&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The task can be broken down to below sub tasks&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;1.To find the desired node&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;2. Find and store all the elements in its vicinity of distance k&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;3. Sort the nodes by value and print the same.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Obviously the recursion is the key, we recursively iterate over the nodes of the tree and as soon as the target node is found, we publish this result to the calling function so that all the nodes can be stored&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The below code snippet prints the nodes at a distance of atmost k. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;int printNodeAtKrec(struct tree * root, struct tree * target, int k, vector &amp;lt;int&amp;gt; &amp;amp;v, int n) {
    if(root == NULL)
        return 0;
    int left = 0, right = 0, level = n;
    if(root == target)
        level = k;
    left = printNodeAtKrec(root-&amp;gt;left, target, k, v, level - 1);
    level = max(level, left);
    right = printNodeAtKrec(root-&amp;gt;right, target, k, v, level - 1);
    if(right &amp;gt; 0 &amp;amp;&amp;amp; level &amp;lt; 0) {
        level = right;
        printNodeAtKrec(root-&amp;gt;left, target, k, v, level - 1);
    }
    if(level &amp;gt; 0)
        v.push_back(root-&amp;gt;data);
    return level - 1;
}

void printNodeAtK(struct tree * t, struct tree * r, int k) {
    vector &amp;lt;int&amp;gt; v;
    printNodeAtKrec(t, r, k + 1, v, 0);
    sort(v.begin(), v.end());
    for(int i = 0; i &amp;lt; v.size(); i++)
        cout&amp;lt;&amp;lt;v[i]&amp;lt;&amp;lt;endl;
}&lt;/pre&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/3937995031067377520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2012/01/amazon-online-test-find-nodes-at-k.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3937995031067377520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/3937995031067377520'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2012/01/amazon-online-test-find-nodes-at-k.html' title='[Amazon Online Test] Find the nodes at k distance.'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-1661380361209583253</id><published>2011-12-20T09:56:00.000+05:30</published><updated>2015-04-06T02:16:01.515+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorial"/><title type='text'>Calculating the multiplicative inverse</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Given a number x, find its multiplicative inverse y for a given modulo N&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;i.e. (x*y) == 1(MOD N)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Where the multiplicative inverse is useful?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Lets assume we need to compute ((a1 * a2 *....)/(b1 * b2 * .....)) mod N&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;1 simple way is to compute the above expression as&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;long long res = 1;
for(int i = 0; i &amp;lt; n; i++)
    res *= a[i];
for (int i = 0; i &amp;lt; n; i++)
    res /= b[i];
res %= MOD;
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;But, wait there is a catch, what if a1* a2 * .... overflows the long long range or the datatype under use?&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So what are the possible options. Some people might fall into the trap&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;res = (res * a[i]) % MOD;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;res = (res /a[i]) % MOD;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;While first statement is perfectly correct, but the subsequent divisions operations are incorrect.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;You can pick some of the examples to reason it out!&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So moving ahead, one most common &#39;trick&#39; which would hit us would be, how we used to perform these operations in our early school days.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Get the prime factorizations of a1, a2, a3...., b1, b2, b3,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;And then cancel out the common factors,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Then the problem reduces to find the multiplication of the left out factors(lets say c[]) which can be done by&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;for(int i = 0; i &amp;lt; n; i++)
    res = (res * c[i]) % MOD;&lt;/pre&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;But sooner or later you would realise, this easy looking task is actually quite expensive. Infact the good methods would take around O(sqrt(n)) per number to factorize itself.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So for (n&amp;nbsp;+ n) numbers with average value of x the overall complexity would be&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;n * O(sqrt(x))&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;With this approach as the average value x increases the code would timeout for most of the cases.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So whats next? Most of us who are familiar with the set theory would be thinking about the possibility of computing the multiplicative inverse.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;So formally, for a number x, a number y is a multiplicative inverse if&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;(x * y) % &amp;nbsp;N = 1 or&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;, sans-serif;&quot;&gt;(x * y) == 1(MOD N)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;A naive implementation to compute the inverse would be to try y for all the numbers between 1 to N - 1 and find the suitable match.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Well, there is a Fermat&#39;s Little&amp;nbsp;theorem&amp;nbsp;which could help us here, if MOD is prime number then the inverse can be given by&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;a^{m-2} \equiv a^{-1} \pmod{m}.&quot; class=&quot;latex&quot; height=&quot;18&quot; scale=&quot;2&quot; src-orig=&quot;https://s0.wp.com/latex.php?latex=a%5E%7Bm-2%7D+%5Cequiv+a%5E%7B-1%7D+%5Cpmod%7Bm%7D.&amp;amp;bg=ffffff&amp;amp;fg=1c1c1c&amp;amp;s=0&quot; src=&quot;https://s0.wp.com/latex.php?zoom=2&amp;amp;latex=a%5E%7Bm-2%7D+%5Cequiv+a%5E%7B-1%7D+%5Cpmod%7Bm%7D.&amp;amp;bg=ffffff&amp;amp;fg=1c1c1c&amp;amp;s=0&quot; style=&quot;background-color: white; border: none; color: #222222; font-family: &#39;Lucida Grande&#39;, &#39;Lucida Sans Unicode&#39;, Helvetica, Arial, sans-serif; font-size: 13px; line-height: 19.5px; margin: 0px 5px; padding: 2px; vertical-align: middle;&quot; title=&quot;a^{m-2} \equiv a^{-1} \pmod{m}.&quot; width=&quot;155&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The a ^ n can be calculated in O(log n) time, for details you can refer&amp;nbsp;&lt;a href=&quot;http://coders-stop.blogspot.in/2010/12/compute-powerxn-in-logn-steps.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
So the overall complexity boils down to n * O(log M)&lt;br /&gt;
&lt;br /&gt;
So what do we do if the MOD value is not a prime number? Can we solution this based on Fermat&#39;s theorem? This is left as an exercise to the reader :)&lt;br /&gt;
&lt;br /&gt;
Sidenote, there are several other methods to achieve in a more optimised way.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/1661380361209583253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2011/12/calculating-multiplicative-inverse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/1661380361209583253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/1661380361209583253'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2011/12/calculating-multiplicative-inverse.html' title='Calculating the multiplicative inverse'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-6499201638474037926</id><published>2011-12-10T17:29:00.001+05:30</published><updated>2015-03-11T21:12:59.692+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dynamic Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>[Amazon Interview] Finding the shortest path</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Given a matrix having non negative integers you have to find the shortest path from one point to  another within the matrix. The cost of path is all the matrix entries on  the way. You can move in any direction (up, down, left, right,  diagonally)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;e.g.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;5 9  10 1&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;3 7  4  4&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;8 2  1  9&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;So shortest path from (0,0) to (2,2) - 5+3+2+1 = 11&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;b&gt;Approach:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;The matrix can be easily converted to a graph with each element having its neighbors as the up, down, left, right and diagonal elements.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Just pass this graph into any one of the Single source shortest path algorithm and you will find the minimum distance between the two elements&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Can we do better ?&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/6499201638474037926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2011/12/finding-shortest-path.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/6499201638474037926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/6499201638474037926'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2011/12/finding-shortest-path.html' title='[Amazon Interview] Finding the shortest path'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3418265334198879901.post-7918399320047958193</id><published>2011-10-21T06:18:00.000+05:30</published><updated>2015-03-21T13:50:44.096+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arrays"/><category scheme="http://www.blogger.com/atom/ns#" term="Greedy"/><category scheme="http://www.blogger.com/atom/ns#" term="Interview"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type='text'>Maximising the duration</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;There is a TV avid person, who wants to spend his maximum time on TV.  There are N channels that telecast programs of different length at  different timings. Find the program and channel number so that  the person can spend his max time on TV. If the person watches a program, he watches it completely.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;For e.g&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Channel1:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;prg1: 8:00 am - 9:00am&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;prg2: 9:30 am - 12:00 am&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Channel2:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;prg1: 8:15 am - 9:30am&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;prg2: 9:30 am - 11:45 am&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;In this case, between 8:00 AM to 12:00 noon, the answer is:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;ch2/prg1 + ch1/prg2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;b&gt;&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Approach:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Trebuchet MS, sans-serif;&quot;&gt;Sort the programs with the end times. And then apply the greedy algorithm to find the maximum duration. &lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coders-stop.blogspot.com/feeds/7918399320047958193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coders-stop.blogspot.com/2011/10/maximising-duration.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7918399320047958193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3418265334198879901/posts/default/7918399320047958193'/><link rel='alternate' type='text/html' href='http://coders-stop.blogspot.com/2011/10/maximising-duration.html' title='Maximising the duration'/><author><name>Aviral</name><uri>http://www.blogger.com/profile/11920144614598355124</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>