��<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40" xmlns:ns0="http://macVmlSchemaUri"> <head> <meta http-equiv=Content-Type content="text/html; charset=unicode"> <meta name=ProgId content=Word.Document> <meta name=Generator content="Microsoft Word 15"> <meta name=Originator content="Microsoft Word 15"> <link rel=File-List href="NOI%20Ref.fld/filelist.xml"> <link rel=Edit-Time-Data href="NOI%20Ref.fld/editdata.mso"> <!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>Wenhui Yang</o:Author> <o:Template>Word Work File D_1.tmp</o:Template> <o:LastAuthor>Microsoft Office User</o:LastAuthor> <o:Revision>432</o:Revision> <o:TotalTime>272</o:TotalTime> <o:LastPrinted>2018-02-09T14:01:00Z</o:LastPrinted> <o:Created>2017-12-24T06:30:00Z</o:Created> <o:LastSaved>2018-08-29T16:03:00Z</o:LastSaved> <o:Pages>67</o:Pages> <o:Words>14437</o:Words> <o:Characters>82297</o:Characters> <o:Lines>685</o:Lines> <o:Paragraphs>193</o:Paragraphs> <o:CharactersWithSpaces>96541</o:CharactersWithSpaces> <o:Version>16.00</o:Version> </o:DocumentProperties> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--> <link rel=themeData href="NOI%20Ref.fld/themedata.thmx"> <link rel=colorSchemeMapping href="NOI%20Ref.fld/colorschememapping.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Print</w:View> <w:Zoom>113</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="&#45;-"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="375"> <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> <w:LsdException Locked="false" Priority="39" Name="Table Grid"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" Name="Light List"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> </w:LatentStyles> </xml><![endif]--> <style> <!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:-536870145 1342208091 0 0 415 0;} @font-face {font-family:Courier; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"-�3� fg"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-536870145 1791491579 134217746 0 131231 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:���; mso-font-charset:129; mso-generic-font-family:auto; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:�[SO; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 2 5 0 0 0 0 0 0 0; mso-font-alt:�e0}fԚ; mso-font-charset:136; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"-�3� �0�0�0�0"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-536870145 1791491579 134217746 0 131231 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:˳��; mso-font-charset:129; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 9 6 1 1 1 1 1; mso-font-alt:ўSO; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 2 5 9 0 0 0 0 0 0; mso-font-alt:0}fԚ; mso-font-charset:136; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-alt:fg; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:t���; mso-font-charset:129; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Mangal; panose-1:2 4 5 3 5 2 3 3 2 2; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:32771 0 0 0 1 0;} @font-face {font-family:Latha; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Raavi; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Yu Gothic"; panose-1:2 11 4 0 0 0 0 0 0 0; mso-font-alt:8n�0�0�0�0; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:DengXian; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:I{�~; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-536859905 -1073732485 9 0 511 0;} @font-face {font-family:"Calibri Light"; panose-1:2 15 3 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-536859905 -1073732485 9 0 511 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"DengXian Light"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:"I{�~ Light"; mso-font-charset:134; mso-generic-font-family:roman; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Cambria; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536869121 1073743103 0 0 415 0;} @font-face {font-family:Times; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 7 0;} @font-face {font-family:Geneva; panose-1:2 11 5 3 3 4 4 4 2 4; mso-font-charset:77; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:77; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:77; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"__ __"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:__; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:129; mso-generic-font-family:auto; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:____; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:136; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"__ ____"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:"System Font"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:136; mso-generic-font-family:auto; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"\@__ ____"; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-pitch:fixed; mso-font-signature:-536870145 1791491579 134217746 0 131231 0;} @font-face {font-family:"\@__ __"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-pitch:fixed; mso-font-signature:-536870145 1791491579 134217746 0 131231 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-520081665 -1073717157 41 0 66047 0;} @font-face {font-family:"\@__"; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} @font-face {font-family:"\@DengXian Light"; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:-1610612033 953122042 22 0 262159 0;} @font-face {font-family:"\@DengXian"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-1610612033 953122042 22 0 262159 0;} @font-face {font-family:Menlo; panose-1:2 11 6 9 3 8 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-436198657 -771687941 33554472 0 479 0;} @font-face {font-family:Consolas; panose-1:2 11 6 9 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} p.MsoHeader, li.MsoHeader, div.MsoHeader {mso-style-priority:99; mso-style-link:"Header Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center 234.0pt right 468.0pt; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} p.MsoFooter, li.MsoFooter, div.MsoFooter {mso-style-priority:99; mso-style-link:"Footer Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:center 234.0pt right 468.0pt; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:#0563C1; mso-themecolor:hyperlink; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:#954F72; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} pre {mso-style-noshow:yes; mso-style-priority:99; mso-style-link:"HTML Preformatted Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Courier New"; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} span.HTMLPreformattedChar {mso-style-name:"HTML Preformatted Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"HTML Preformatted"; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; font-family:"Courier New"; mso-ascii-font-family:"Courier New"; mso-hansi-font-family:"Courier New"; mso-bidi-font-family:"Courier New";} p.msonormal0, li.msonormal0, div.msonormal0 {mso-style-name:msonormal; mso-style-unhide:no; mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman",serif; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast;} span.HeaderChar {mso-style-name:"Header Char"; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:Header; mso-ansi-font-size:12.0pt; mso-bidi-font-size:12.0pt;} span.FooterChar {mso-style-name:"Footer Char"; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:Footer; mso-ansi-font-size:12.0pt; mso-bidi-font-size:12.0pt;} p.p1, li.p1, div.p1 {mso-style-name:p1; mso-style-unhide:no; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:9.0pt; font-family:Helvetica; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-bidi-font-family:"Times New Roman"; color:#454545;} p.p2, li.p2, div.p2 {mso-style-name:p2; mso-style-unhide:no; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:widow-orphan; font-size:9.0pt; font-family:Helvetica; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-bidi-font-family:"Times New Roman"; color:#454545;} p.p3, li.p3, div.p3 {mso-style-name:p3; mso-style-unhide:no; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:widow-orphan; font-size:9.0pt; font-family:Helvetica; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-bidi-font-family:"Times New Roman"; color:#454545;} span.pln {mso-style-name:pln; mso-style-unhide:no;} span.str {mso-style-name:str; mso-style-unhide:no;} span.pun {mso-style-name:pun; mso-style-unhide:no;} span.kwd {mso-style-name:kwd; mso-style-unhide:no;} span.lit {mso-style-name:lit; mso-style-unhide:no;} span.com {mso-style-name:com; mso-style-unhide:no;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single; color:teal;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} /* Page Definitions */ @page {mso-footnote-separator:url("NOI%20Ref.fld/header.html") fs; mso-footnote-continuation-separator:url("NOI%20Ref.fld/header.html") fcs; mso-endnote-separator:url("NOI%20Ref.fld/header.html") es; mso-endnote-continuation-separator:url("NOI%20Ref.fld/header.html") ecs;} @page WordSection1 {size:595.0pt 842.0pt; margin:72.0pt 72.0pt 72.0pt 72.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-even-header:url("NOI%20Ref.fld/header.html") eh1; mso-header:url("NOI%20Ref.fld/header.html") h1; mso-even-footer:url("NOI%20Ref.fld/header.html") ef1; mso-footer:url("NOI%20Ref.fld/header.html") f1; mso-first-header:url("NOI%20Ref.fld/header.html") fh1; mso-first-footer:url("NOI%20Ref.fld/header.html") ff1; mso-paper-source:0;} div.WordSection1 {page:WordSection1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style> <![endif]--> <meta name=Title content=""> <meta name=Keywords content=""> <!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="2049"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> </head> <body bgcolor=white lang=EN-SG link="#0563C1" vlink="#954F72" style='tab-interval: 36.0pt'> <div class=WordSection1> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-family:Menlo;mso-ansi-language:EN-US'>NOI Reference<o:p></o:p></span></b></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Last edited: 15<sup>th</sup> March 2018<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Graph Theory<o:p></o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Depth First Search O(V+E)</span></u><span lang=EN-US style='font-size:5.0pt;mso-bidi-font-size:10.0pt;font-family:Menlo; color:#333333;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjlist[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dist[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(visited[x]) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(visited[i]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dist[i] = dist[x]+i.second; // dist only valid for trees!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Toposort (DFS) O(V+E)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjList[N], topo;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs (int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if (visited[x]) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>visited[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (auto i : adjList[x]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (visited[i]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>dfs(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>topo.push_back(x); // post ordering<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>/* Usage */<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>topo.clear();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(visited, 0, sizeof(visited)); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for (int i = 0; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if (visited[i]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>dfs(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>reverse(topo.begin(), topo.end()); //to get the correct topological order<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Breadth First Search O(V+E)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dx[8] = {-1, 0, 1, -1, 1, -1, 0, 1};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dy[8] = {-1, -1, -1, 0, 0, 1, 1, 1};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dist[H][W];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[sx][sy] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>q.push(pi(sx, sy)); // x,y<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!q.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int x = q.front().first.first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int y = q.front().first.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>q.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;8; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int newx = x+dx[i]; int newy = y+dy[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!valid(newx, newy)) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!visited[newx][newy]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dist[newx][newy] = dist[x][y]+1; // only for unweighted graphs<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>q.push(pi(newx, newy));<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>UFDS Amortized O(1)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int findSet(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(p[x] == x) return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>else return p[x] = findSet(p[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool same(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return findSet(x) == findSet(y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void merge(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>p[findSet(x)] = findSet(y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Floyd (APSP) O(V<sup>3</sup>)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int adjmat[N][N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// remember adjmat[i][i] == 0<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int k = 0; k&lt;N; k++){ // intermediate node outside<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int j = 0; j&lt;N; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(adjmat[i][k] == -1 or adjmat[k][j] == -1) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(adjmat[i][j] == -1 or adjmat[i][j]&gt;adjmat[i][k]+adjmat[k][j])<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>adjmat[i][j] = adjmat[i][j]+adjmat[k][j];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Bellman-Ford (SSSP) O(NE)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[s]=0; //dist all others = INF<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for (int i=0; i&lt;N-1; i++){<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for (int j=0; j&lt;E; j++){<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>dist[v]=min(dist[v],dist[u]+c); // dir edge from u to v with c cost<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Dijkstra(SSSP) O(ElogN)<o:p></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>priority_queue&lt;pi, vector&lt;pi&gt;, greater&lt;pi&gt;&gt; pq; // greater is important!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[source] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pq.push(pi(0, source));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int node = pq.top().second; int d = pq.top().first; pq.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(dist[node] != d) continue; // important!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[node]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int childnode = i.first, childdist = i.second;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:22.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>if(dist[childnode] == -1 or dist[childnode] &gt; dist[node] + childdist){ <o:p></o:p></span></p> <p class=MsoNormal style='text-indent:22.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>//note: strictly greater than is important!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>dist[childnode] = dist[node] + childdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>pq.push(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Dijkstra Variant (Longest Path, Positive Cycle Detection) (problem: girlfriend)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define INF -2<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool infinite[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int visited[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>priority_queue&lt;pi&gt; pq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,e,source,dest;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(visited[x]) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(visited[i.first] == 0) dfs(i.first);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else if(visited[i.first] == 1) infinite[i.first] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = 2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; e &gt;&gt; source &gt;&gt; dest;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;e; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(pi(b,c));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) if(visited[i] == 0) dfs(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(infinite[source])<span style='mso-spacerun:yes'>� </span>dist[source] = -2; else dist[source] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pq.push(pi(dist[source], source));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int node = pq.top().second; int d = pq.top().first; pq.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(d != dist[node]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i : adjlist[node]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int childnode = i.first; int childdist = i.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(dist[node] == INF){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>if(dist[childnode] == INF) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>dist[childnode] = INF;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>pq.push(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}else if(dist[childnode] == INF) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>else if(dist[childnode] == -1 or (dist[childnode] &lt; dist[node] + childdist)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>if(infinite[childnode]) dist[childnode] = INF;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else dist[childnode] = dist[node] + childdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>pq.push(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Dijkstra with Ways Counting</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[source] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ways[source] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pq.push(pi(0,source));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int node = pq.top().second; int d = pq.top().first; pq.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(dist[node] != d) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[node]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int childnode = i.first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int childdist = i.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(dist[childnode] == -1 or dist[childnode] &gt; dist[node] + childdist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>dist[childnode] = dist[node]+childdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>ways[childnode] = ways[node];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>pq.push(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}else if(dist[childnode] == dist[node]+childdist) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>ways[childnode] += ways[node];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Dijkstra with Shortest Path DAG<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(from, -1, sizeof from);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[source] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>from[source] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pq.push(pi(0,source));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll node = pq.top().second; ll d = pq.top().first; pq.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(dist[node] != d) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[node]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll childnode = i.first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll childdist = i.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(dist[childnode] == -1 or dist[childnode] &gt; dist[node] + childdist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dist[childnode] = dist[node]+childdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>from[childnode] = node;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>pq.push(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>0-1 BFS (SSSP on 0-1 edges) O(E+V)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dist[source] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pq.push_front(pi(0, source));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int node = pq.front().second; int d = pq.front().first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(dist[node] != d) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[node]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int childnode = i.first, childdist = i.second; // childdist == 0 or 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(dist[childnode] == -1 or dist[childnode] &gt; dist[node] + childdist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>dist[childnode] = dist[node] + childdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(childdist == 1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>pq.push_back(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>pq.push_front(pi(dist[childnode], childnode));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>SPFA(SSSP) (untested)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int,int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjList[10000]; // node, weight<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>queue&lt;int&gt; q; // node<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bitset&lt;10000&gt; in_q; //1 if node is in queue, bitset is same as bool array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dist[10000];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(dist, -1, sizeof(dist)); // initialise to -1, representing infinity<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>q.push(source); dist[source] = 0; in_q[source] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!q.empty()){<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>int c = q.front();<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>q.pop();<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>in_q[c] = 0;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for(auto i : adjList[c]){<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if(dist[i.first] == -1 || dist[i.first] &gt; dist[c] + i.second){<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>dist[i.first] = dist[c] + i.second;<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if (!in_q[i.first]) q.push(i.first); <o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>in_q[i.first] = 1;<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Bipartite Matching <o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool dfs(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(visited[x]) return false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(color[i] == color[x]){ /*clash*/ }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>color[i] = 3-color[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(!visited[i]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(dfs(i)) { /*clash*/ }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return false; // no clash<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Kruskal (MST) O(ElogV)<o:p></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//UFDS<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int findSet(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(p[x] == x) return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>else return p[x] = findSet(p[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool same(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return findSet(x) == findSet(y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void merge(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>p[findSet(x)] = findSet(y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>sort(edgelist+1, edgelist+e+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int totalcost = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int i = 1; i &lt;= e; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int cost = edgelist[i].first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int firstguy = edgelist[i].second.first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int secondguy = edgelist[i].second.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if (same(firstguy, secondguy)) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>totalcost += cost;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>merge(firstguy, secondguy);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Prim (MST) O(ElogV)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int,int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjList[10000]; // node, weight<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>priority_queue&lt;pi, vector&lt;pi&gt;, greater&lt;pi&gt; &gt; pq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[10000];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pq.push(pi(0, 0));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(!pq.empty()){<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>pi c = pq.top();<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>pq.pop();<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>if(visited[c.second]) continue;<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>visited[c.second] = true;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for(auto i : adjList[c.second]){<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if(!visited[i.second]){<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>pq.push(pi(i.second, i.first));<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Tree Diameter<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int treediam(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(visited, false, sizeof visited);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>dist[V[0]] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>dfs(V[0]); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int furthestdist = -1, furthestindex = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(dist[i] &gt; furthestdist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>furthestdist = dist[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>furthestindex = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(visited, false, sizeof visited);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(dist, -1, sizeof dist);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>dist[furthestindex] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>furthestdist = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(dist[i] &gt; furthestdist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>furthestdist = dist[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>furthestindex = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return furthestdist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>TSP on Tree<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int V[N]; // nodes to visit<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool goals[N]; // whether node is a place to visit<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// find the subtree<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool dfs(ll x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(visited[x]) return false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>bool need=false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(goals[x]) need=true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(dfs(i.first)) ans+=i.second, need=true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return need;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>dfs(V[0]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ans*=2; // subtree weights * 2<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ans -= treediam();<span style='mso-spacerun:yes'>� </span>// minus the tree diameter<o:p></o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>2<sup>k</sup> Decomposition &lt;O(NlogN), O(logN)&gt;<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[100050][20];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int q,n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void roottree(int x, int par){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>p[x][0] = par;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(i.first == par) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>dist[i.first] = dist[x] + i.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>depth[i.first] = depth[x]+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>roottree(i.first, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void tkd(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int k = 1; k&lt;20; k++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(p[i][k-1] != -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>p[i][k] = p[p[i][k-1]][k-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}else p[i][k] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x, int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 20; i&gt;=0; i--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(k&gt;=(1&lt;&lt;i)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(x!=-1) x = p[x][i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>k-=(1&lt;&lt;i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�� </span><span style='mso-spacerun:yes'>�</span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LCA<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// 2KD<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lca(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(depth[a] &lt; depth[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int k = 19; k&gt;=0; k--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(p[a][k] != -1 and depth[p[a][k]] &gt;= depth[b]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>a = p[a][k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(a==b) return a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int k = 19; k&gt;=0; k--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(p[a][k] != p[b][k]) a=p[a][k], b=p[b][k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return p[a][0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>APSP<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//LCA<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int apsp(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return dist[a]+dist[b]-2*dist[lca(a,b)];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>MCBM (Augmenting Path) (slow)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjlist[255];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[255];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[255];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int aug(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(visited[x]) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(p[i] == -1 or aug(p[i])){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>p[i] = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>p[x] = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>memset(p, -1, sizeof p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(auto i : left){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(visited, false, sizeof visited); // very important***<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(p[i] == -1) ans += aug(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Note: On Bipartite Graph, |MVC| == |MCBM| (Knig</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:"Tahoma",sans-serif;mso-ansi-language:EN-US'>s</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'> Theorem)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Note: On Bipartite Graph, |MIS| == |V|-|MCBM|<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>MCBM (Hopcroft Karp) (fast) O(sqrt(V)E)</span></u><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define MAX 100001 // edit accordingly<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define nil 0<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define inf INT_MAX<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct MCBM{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; adjlist[MAX];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int n, m, match[MAX], dist[MAX];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// n: number of nodes on left side, nodes are numbered 1 to n<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// m: number of nodes on right side, nodes are numbered n+1 to n+m<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// G = nil[0] _ G1[G[1---n]] _ G2[G[n+1---n+m]] <b style='mso-bidi-font-weight:normal'>// important!!<o:p></o:p></b></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>MCBM(int nn, int mm){<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:2'>������������� </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>n = nn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = mm;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool bfs() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int i, u, v, len;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>queue&lt; int &gt; Q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(i=1; i&lt;=n; i++) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>if(match[i]==nil) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>dist[i] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>Q.push(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>else dist[i] = inf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dist[nil] = inf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(!Q.empty()) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>u = Q.front(); Q.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>if(u!=nil) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>for(auto v : adjlist[u]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>����������� </span>if(dist[match[v]]==inf) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��������������� </span>dist[match[v]] = dist[u] + 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��������������� </span>Q.push(match[v]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>����������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return (dist[nil]!=inf);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool dfs(int u) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int i, v, len;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(u!=nil) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>len = adjlist[u].size();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>for(i=0; i&lt;len; i++) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>v = adjlist[u][i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>if(dist[match[v]]==dist[u]+1) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>����������� </span>if(dfs(match[v])) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��������������� </span>match[v] = u;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��������������� </span>match[u] = v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��������������� </span>return true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>����������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>dist[u] = inf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>return false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int hopcroft_karp() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int matching = 0, i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// match[] is assumed nil for all vertex in adjlist<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(bfs())<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>��� </span>for(i=1; i&lt;=n; i++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>������� </span>if(match[i]==nil &amp;&amp; dfs(i))<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>����������� </span>matching++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return matching;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void addEdge(int u, int v){ // left to right<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>assert(v&gt;n);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[u].push_back(v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}; //usage MCBM g(n,m); g.addEdge(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Tarjan</span></u><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:"Tahoma",sans-serif; mso-ansi-language:EN-US'>s</span></u><u><span lang=EN-US style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'> SCC</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjlist[100050]; // normal adjlist<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int disc[100050], low[100050]; // required for tarjan<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool onstack[100050]; //required for tarjan<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int inSCC[100050]; // which scc a node is in<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set&lt;int&gt; sccAdjlist[100050]; // scc adjlist<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; s, newscc;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;vector&lt;int&gt; &gt; SCCs; // list of sccs<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; edgelist; // normal edgelist<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int counter = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void scc(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>disc[x] = low[x] = counter++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s.push_back(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>onstack[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(disc[i] == -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>scc(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>low[x] = min(low[x], low[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else if(onstack[i]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>low[x] = min(low[x], disc[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(disc[x] == low[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>newscc.clear();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>do{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>newscc.push_back(s.back());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>onstack[s.back()] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>inSCC[s.back()] = SCCs.size();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>s.pop_back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}while(newscc[newscc.size()-1] != x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>SCCs.push_back(newscc);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>memset(disc, -1, sizeof disc);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;e; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edgelist.push_back(pi(a,b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) if(disc[i] == -1) scc(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : edgelist){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sccAdjlist[inSCC[i.second]].insert(inSCC[i.first]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;SCCs.size(); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(sccAdjlist[i].find(i) != sccAdjlist[i].end()) sccAdjlist[i].erase(sccAdjlist[i].find(i));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Transitive Closure O(V^2)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool trans[2050][2050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>trans[x][y] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[y]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!trans[x][i]) dfs(x,i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs(i,i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Random </span></u><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;mso-ascii-font-family: Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-ansi-language: EN-US'>�</span></u><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>eleport�solution<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int visited[500050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pre[500050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ctr = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int stopat = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n, A[500050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dfs(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(visited[x] &gt; 0) return visited[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(visited[x] == -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>visited[x] = ctr-pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>stopat = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return -visited[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre[x] = ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ret = dfs(A[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ret &lt; 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>visited[x] = -ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-tab-count:1'>������ </span>if(stopat == x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>stopat = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return -ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = ret + 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return visited[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Articulation points (bombing2)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int depth[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int low[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int parent[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set&lt;int&gt; adjlist[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int childcount = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int components[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; articulationpoints;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int d = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int atp(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>depth[x] = d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>low[x] = d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>d++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>childcount = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!visited[i]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>parent[i] = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>atp(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(low[i] &gt;= depth[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>components[x]++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>low[x] = min(low[x], low[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else if(i != parent[x]) low[x] = min(low[x], depth[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<span style='mso-tab-count:1'>�� </span><o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>parent[0] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;e; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b; cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].insert(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].insert(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>atp(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = components[0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = max(ans, components[i]+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// printf(&quot;%d: %d\n&quot;, i, components[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><i style='mso-bidi-font-style:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Pseudocode:<o:p></o:p></span></i></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>GetArticulationPoints(i, d)<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>visited[i] = true<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>depth[i] = d<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>low[i] = d<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>childCount = 0<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>isArticulation = false<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for each ni in adj[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if not visited[ni]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>parent[ni] = i<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>GetArticulationPoints(ni, d + 1)<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>childCount = childCount + 1<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if low[ni] &gt;= depth[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>isArticulation = true<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>low[i] = Min(low[i], low[ni])<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>else if ni &lt;&gt; parent[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>low[i] = Min(low[i], depth[ni])<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if (parent[i] &lt;&gt; null and isArticulation) or (parent[i] == null and childCount &gt; 1)<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>Output i as articulation point<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Articulation Bridges<o:p></o:p></span></u></p> <p class=MsoNormal><i style='mso-bidi-font-style:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Pseudocode:<o:p></o:p></span></i></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>GetBridges(i, d)<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>visited[i] = true<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>depth[i] = d<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>low[i] = d<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for each ni in adj[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if not visited[ni]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>parent[ni] = i<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>GetBridges(ni, d + 1)<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if low[ni] &gt; depth[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:108.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>Output i,ni as bridge<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>low[i] = Min(low[i], low[ni])<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>else if ni &lt;&gt; parent[i]<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>low[i] = Min(low[i], depth[ni])<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:72.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Centroid Decomposition<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int nn = 0; // num nodes<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int subsize[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int cpar[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs1(int x, int p){ // compute subtree sizes<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>subsize[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nn++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs1(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>subsize[x] += subsize[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dfs2(int x, int p){ // finds the centroid in subtree rooted at x<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(subsize[i] &gt; nn/2) return dfs2(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void decomp(int x, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nn = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs1(x, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int centroid = dfs2(x,x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(p == -1) p=centroid;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cpar[centroid] = p;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[centroid]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[i].erase(centroid);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>decomp(i, centroid);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>adjlist[centroid].clear();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// called with decomp(0, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Centroid Decomp (primedst)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll dist[20][50050]; // depth of tree, dist to centroid<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll subsize[50005];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll nn = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;ll&gt; primes;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set&lt;ll&gt; adjlist[50050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bitset&lt;50050&gt; isPrime;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void calcsize(ll x, ll p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>subsize[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nn++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>calcsize(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>subsize[x] += subsize[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll centroid(ll x, ll p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(subsize[i] &gt; nn/2) return centroid(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void edit(ll x, ll p, ll depth, ll d, ll change){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// update the subtree at depth, x, all by change<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dist[depth][d] += change;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edit(i, x, depth, d+1, change); // recurse on children<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll getadd(ll x, ll p, ll depth, ll d){ // this node is currently at distance d away<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ret = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : primes){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i-d &lt; 0) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll add = dist[depth][i-d]; // number of nodes, i-d away from centroid<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(add == 0) break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == d) add*=2; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ret += add;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i != p) ret+=getadd(i,x,depth,d+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<span style='mso-tab-count: 1'>����� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void decomp(ll x, ll depth){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nn = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>calcsize(x, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll cen = centroid(x,x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>edit(cen, cen, depth, 0, 1); // make all one<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll add=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[cen]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edit(i,cen,depth,1,-1); // remove this subtree contribution<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>add+=getadd(i,cen,depth,1); // get the contributions<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edit(i,cen,depth,1,1); // change back<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ans += add;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[cen]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[i].erase(cen);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>decomp(i, depth+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;=n; i++) dist[depth][i] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void genprimes(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>isPrime.reset(); isPrime.flip();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>isPrime[2] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>primes.push_back(2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 2; i*2 &lt;= n+10; i++) isPrime[i*2] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 3; i&lt;=n+10; i+=2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!isPrime[i]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>primes.push_back(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(ll j = 2; i*j&lt;=n+10; j++) isPrime[i*j] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>freopen(&quot;input.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>genprimes();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].insert(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].insert(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>decomp(1,1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>double a = (double) ans / 2.0; // divide by two because double counting<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>double b = ((double) n * (double) (n-1)) / 2.0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; a/b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LCA to RMQ &amp; Euler Tour Decomp (ants) Version #1<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &quot;ants.h&quot;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long<span style='mso-spacerun:yes'>� </span>ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;ll, ll&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll fw[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll S[100050], E[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll ctr=1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n, edges;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// lca setup<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int st[200050][19]; // s[x][0] is self<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pre[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pre_r[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int prectr = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre[x] = prectr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre_r[prectr] = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>prectr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i.first == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs(i.first, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update(ll p, ll v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=2*edges+9;p+=p&amp;(-p)) fw[p] += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll query(ll x, ll y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;y;y-=y&amp;(-y)) ans+=fw[y];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>x--;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;x;x-=x&amp;(-x)) ans-=fw[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void printfw(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i=1; i&lt;=2*edges+9; i++) printf(&quot;%d &quot;, query(i, i)); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void roottree(ll x, ll p, ll d){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>st[ctr][0] = pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>S[x] = ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i.first == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update(ctr, i.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>roottree(i.first, x, d+i.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update(ctr, -i.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>st[ctr][0] = pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>E[x] = ctr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void sparse_init(){<span style='mso-tab-count:1'> </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;=16; k++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 0; i&lt;2*edges+9; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>st[i][k] = min( st[i][k-1], st[i+(1&lt;&lt;(k-1))][k-1] );<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int minq(int x, int y){ // [x, y]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>if(x&gt;y) swap(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>assert(x&lt;=y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int len = y-x+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int k = 32-1-__builtin_clz(len);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return min(st[x][k], st[y-(1&lt;&lt;k)+1][k]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lca(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-tab-count:1'>����� </span>if(S[x] &gt; S[y]) swap(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = pre_r[minq(S[x], S[y])];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;pi, ll&gt; iii;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;iii&gt; edgelist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void tree(int _N, int _E, int A[], int B[], int D[]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>n = _N, edges = _E;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;_E; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[A[i]].push_back({B[i], D[i]});<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[B[i]].push_back({A[i], D[i]});<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edgelist.emplace_back(iii(pi(A[i], B[i]), D[i]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs(0, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>roottree(0, -1, 0); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sparse_init();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(ll i = 0; i&lt;n; i++) printf(&quot;%d-%d\n&quot;, S[i], E[i]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(ll i = 1; i&lt;2*edges+9; i++) printf(&quot;%d: %d\n&quot;, i, query(i, i)); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(ll i = 1; i&lt;2*edges+9; i++) printf(&quot;%d: %d\n&quot;, i, st[i][0]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void adjust(int e, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll a = edgelist[e].first.first, b = edgelist[e].first.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll d = edgelist[e].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(S[a] &gt; S[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a is the earlier one<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(S[b], -d);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>update(E[b], d);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span>update(S[b], v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span>update(E[b], -v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>edgelist[e].second = v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll inf = INT_MAX;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void safe(int e) { // bug occurs when 2 0 and 2 1, and 0 1 3 (perhaps use lca stuff)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll a = edgelist[e].first.first, b = edgelist[e].first.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(S[a] &gt; S[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a is the earlier one<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(S[b], -inf);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(E[b], inf);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dangerous(int e) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll a = edgelist[e].first.first, b = edgelist[e].first.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(S[a] &gt; S[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a is the earlier one<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(S[b], inf);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(E[b], -inf);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int energy(int x, int y) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>printf(&quot;q(%d,%d)=\n&quot;, x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>printf(&quot;S(%d) to S(%d)=\n&quot;, E[x], S[y]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int p = lca(x, y); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = query(E[x], S[p]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans2 = query(E[p], S[y]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// <span style='mso-tab-count: 1'>��� </span>ll ans2 = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ans &lt; -inf/2 or ans &gt; inf/2) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ans2 &lt; -inf/2 or ans2 &gt; inf/2) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans+ans2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>PushRelabel (maxflow, mincut) (noiref, tested) O(N^3)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct Edge {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int to;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll cap, flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>Edge(int tar, ll capacity): to(tar), cap(capacity), flow(0) {}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll amt() { return cap-flow; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct PushRelabel {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;Edge&gt; E;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;vector&lt;int&gt; &gt;G;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; height, cnt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;bool&gt; inq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;ll&gt; excess;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>queue&lt;int&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>PushRelabel(int _N): N(_N), height(_N), cnt(2*_N), inq(_N), excess(_N), G(_N) {}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void AddEdge(int a, int b, ll c) {<span style='mso-spacerun:yes'>� </span>//directed edge a -&gt; b with capacity c<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (a == b) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>G[a].push_back(E.size());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>E.push_back({b, c});<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>G[b].push_back(E.size());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>E.push_back({a, 0});<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Enqueue(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (inq[x] || excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>inq[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>q.push(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Push(int x, int ed) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int it = E[ed].to;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><span style='mso-spacerun:yes'>������</span>if (height[x] &lt;= height[it]) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ll flow = min(excess[x], E[ed].amt());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (flow == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>E[ed].flow += flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>E[ed^1].flow -= flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>excess[x] -= flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>excess[it] += flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>Enqueue(it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-spacerun:yes'>�� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Relabel(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>--cnt[height[x]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>height[x] = 2*N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (auto it:G[x]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (E[it].amt() == 0) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>height[x] = min(height[x], height[E[it].to]+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>++cnt[height[x]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>Enqueue(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void GapHeuristic(int g) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 0; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (height[i] &gt;= g) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>--cnt[height[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-spacerun:yes'>������������</span>height[i] = max(height[i], N+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>++cnt[height[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>Enqueue(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Discharge(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (auto it:G[x]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>Push(x, it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (cnt[height[x]] == 1) GapHeuristic(height[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>else Relabel(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll MaxFlow(int S, int T) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>height[S] = N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>cnt[0] = N-1, cnt[N] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>inq[S] = inq[T] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (auto it:G[S]) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>excess[S] += E[it].cap;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>Push(S, it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>while (!q.empty()) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>int x = q.front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>q.pop(), inq[x] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>Discharge(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return excess[T];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; MinCut(int S, int T) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>MaxFlow(S, T);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int split = N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>vector&lt;int&gt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 1; i &lt;= N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (cnt[i] == 0) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>split = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>���� </span><span style='mso-spacerun:yes'>�������</span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 0; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (height[i] &gt; split) ans.push_back(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LCA to RMQ Version #2 (taqtree)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pre[100050], pre_r[100050]; // pre maps node to pre-ordering, pre_r maps pre-ordering to node<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int fw[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int S[100050], E[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int st[500050][19];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void add(int p, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=2*n+10;p+=p&amp;(-p)) fw[p] += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int p = a-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>assert(p != -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans-=fw[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>p = b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans+=fw[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct edge{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int a,b,c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>edge();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>edge(int aa, int bb, int cc){ a = aa, b = bb, c = cc; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;edge&gt; edgelist;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int prectr = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void preorder(int x, int par){ // this is for lca (rmq)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre_r[prectr] = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre[x] = prectr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<span style='mso-tab-count:1'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i.first == par) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>preorder(i.first, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ctr=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x, int par){ // this is for euler (fenwick)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>S[x] = ctr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>st[ctr][0] = pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span><span style='mso-tab-count: 1'>����� </span>if(i.first == par) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>add(ctr+1, i.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>st[ctr][0] = pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs(i.first, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>add(ctr+1, -i.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>E[x] = ctr+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>�</span>st[ctr][0] = pre[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// settle lca (rmq, st), euler (fenwick)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lca(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(S[a] &gt; S[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int len = S[b]-S[a]+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int k = 32-__builtin_clz(len)-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return pre_r[min(st[S[a]][k], st[S[b]-(1&lt;&lt;k)+1][k])];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void pre_st(){<span style='mso-tab-count:1'>����� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;=18; k++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 1; i&lt;=2*n+9; i++){<span style='mso-tab-count:1'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>assert(i+(1&lt;&lt;(k-1)) &lt;= 500000);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>st[i][k] = min(st[i][k-1], st[i+(1&lt;&lt;(k-1))][k-1]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>freopen(&quot;taqtree.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n-1; i++){<span style='mso-tab-count:1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(pi(b,c));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].push_back(pi(a,c));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>edgelist.push_back(edge(a,b,c));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>preorder(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre_st();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(a == 1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// edit<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>b--;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int olda = edgelist[b].a, oldc = edgelist[b].c, oldb = edgelist[b].b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(S[olda] &gt; S[oldb]) swap(olda, oldb); // olda is now the parent of oldb<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>add(S[oldb], -oldc);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>add(E[oldb], oldc);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>add(S[oldb], c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>add(E[oldb], -c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span></span><span lang=DE style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>edgelist[b].c = c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:3'>��������������������� </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>// change<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(S[b] &gt; S[c]) swap(b,c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int d = lca(b,c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int td = d; if(S[td] &gt; S[b]) swap(td, b); ans += query(S[td]+1, S[b]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>td = d; if(S[td] &gt; S[c]) swap(td, c); ans += query(S[td]+1, S[c]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout &lt;&lt; ans &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Common Paths between Two Paths (sherlockgraphs)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,m,q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool visited[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[100050][20];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int low[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int depth[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pre[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool atp[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int atppre[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ctr=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs(int x){ // just for ATB<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>low[x] = ctr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pre[x] = ctr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!visited[i]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>p[i][0]=x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>depth[i] = depth[x]+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dfs(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(low[i]&gt;pre[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>atp[i] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>low[x] = min(low[i], low[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else if(i != p[x][0]) low[x] = min(low[x], pre[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void atpprecom(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>visited[x] = true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(visited[i]) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p[x][0] != i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>atppre[i] = atppre[x]+atp[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>atpprecom(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void tkd(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;20; k++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(p[i][k-1] != -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>p[i][k] = p[p[i][k-1]][k-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}else p[i][k] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lca(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(depth[a]&lt;depth[b]) swap(a,b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 19; k&gt;=0; k--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p[a][k] != -1 and depth[p[a][k]] &gt;= depth[b]) a=p[a][k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(a==b) return a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 19; k&gt;=0; k--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p[a][k] != p[b][k]) a=p[a][k],b=p[b][k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return p[a][0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dist(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return atppre[a] + atppre[b] - 2*atppre[lca(a,b)];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int inter(int a, int b, int c, int d){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a and c are the lcas<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ac = lca(a,c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int bd = lca(b,d);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ac != a and ac != c) return 0; // disjoint paths<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else if(ac == a){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// a is acestor of c (c stems)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lca(bd, c) == bd) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else ans = dist(bd, c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// c is acestor of a<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lca(bd, a) == bd) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else ans = dist(bd, a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; m &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;m; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].push_back(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>depth[1] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs(1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>tkd();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>memset(visited, false, sizeof visited);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>atpprecom(1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c,d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// join node a and b<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>// output path from c to d<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int u = lca(a,b), v = lca(c,d);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = inter(u, a, v, c) + inter(u, b, v, c) + inter(u, a, v, d) + inter(u, b, v, d);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; dist(c, d) - ans &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Heavy Light Decomposition (grassplant)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef int ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// now a fenwick -.-<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{ <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; fw, fw2; // note this is 1 indexed, queries are built to be 0 indexed<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(){}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(int sz){ s = sz; fw.resize(sz+2); fw2.resize(sz+2); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query1(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(;x;x-=x&amp;(-x)) ans+=fw[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query2(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(;x;x-=x&amp;(-x)) ans+=fw2[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update1(int x, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(;x&lt;=s;x+=x&amp;(-x)) fw[x]+=v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update2(int x, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(;x&lt;=s;x+=x&amp;(-x)) fw2[x]+=v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int point_query(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return query1(x) * x + query2(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int range_query(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return point_query(y) - point_query(x-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void range_add(int x, int y, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update1(x, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update1(y+1, -v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update2(x, -(x-1)*v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update2(y+1, y*v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt; node* &gt; seg;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n, q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct treenode{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll par, chain, depth, size, pos, weight;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// pos is position in chain it is in<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// chain is the chain it is in<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>treenode(){ par = chain = depth = size = pos = weight = 0; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} nodes[100050]; // struct to contain a node<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;ll&gt; adjlist[100050]; // adjacency list<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll segroot[100050], segsize[100050]; // segroot[chain] = root of that segment, segsize[chain] = size of that segment<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs_size(ll x, ll p){ // for hld, calculate sizes , and a bunch of other stuff<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nodes[x].size = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>nodes[i].weight = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>nodes[i].par = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>nodes[i].depth = nodes[x].depth + 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dfs_size(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>nodes[x].size += nodes[i].size;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll curchain = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void hld(ll x, ll p){ // HLD<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nodes[x].chain = curchain;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>segsize[nodes[x].chain] = max(segsize[nodes[x].chain], nodes[x].pos+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll largest = 0, largest_size = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(nodes[i].size &gt;= largest_size) largest = i, largest_size = nodes[i].size;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(largest == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// curchain remains at curchain<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nodes[largest].pos = nodes[x].pos+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>hld(largest, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i == p or i == largest) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>curchain++; // curchain should only be the number of light edges... but it reaches up to 100K<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>segroot[curchain] = i; // root of new chain<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>nodes[i].pos = 0; // root of new chain<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>hld(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll lca(ll a, ll b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(a == b) return a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ac = nodes[a].chain;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll bc = nodes[b].chain;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ac == bc){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return nodes[a].depth &lt; nodes[b].depth ? a : b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ra = segroot[ac];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll rb = segroot[bc];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(nodes[ra].depth &gt; nodes[rb].depth) return lca(nodes[ra].par, b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else return lca(a, nodes[rb].par);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll query(ll a, ll b){ // b is the ancestor<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(nodes[a].chain == nodes[b].chain){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(nodes[b].pos+1 &lt;= nodes[a].pos) return seg[nodes[b].chain]-&gt;range_query(nodes[b].pos+1, nodes[a].pos);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query(nodes[segroot[nodes[a].chain]].par, b) + seg[nodes[a].chain]-&gt;range_query(0, nodes[a].pos);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update(ll a, ll b){ // b is ancestor<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(nodes[a].chain == nodes[b].chain){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(nodes[b].pos+1 &lt;= nodes[a].pos) seg[nodes[b].chain]-&gt;range_add(nodes[b].pos+1, nodes[a].pos, 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>seg[nodes[a].chain]-&gt;range_add(0,nodes[a].pos,1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update(nodes[segroot[nodes[a].chain]].par, b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void printchains(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>printf(&quot;Chains:\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;=curchain; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>printf(&quot;%d : &quot;, i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(ll j = 0; j&lt;segsize[i]; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>printf(&quot;%d &quot;, seg[i]-&gt;range_query(j,j));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>freopen(&quot;grassplant.1.2.in&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;n-1; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll a,b; cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].push_back(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs_size(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>hld(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;=curchain; i++) seg.push_back(new node(segsize[i]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>char qtype; cin &gt;&gt; qtype &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(qtype == 'P'){ // plant<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>update(a, lca(a,b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>update(b, lca(a,b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>//printchains();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{ // query<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout &lt;&lt; query(a, lca(a,b)) + query(b, lca(a,b)) &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>//for(ll i = 1; i&lt;=n; i++) printf(&quot;%d : %d %d\n&quot;, i, nodes[i].chain, nodes[i].pos);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Easy HLD (grassplant)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,q,t=1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int fw1[100050], fw2[100050], size[100050], s[100050], e[100050], nxt[100050], rs[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; adjlist[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int depth[100050], par[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update1(int p, int newv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=100000;p+=p&amp;(-p)) fw1[p] += newv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update2(int p, int newv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=100000;p+=p&amp;(-p)) fw2[p] += newv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void range_update(int x, int y, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update1(x, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update1(y+1, -v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update2(x, -(x-1)*v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update2(y+1, y*v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query1(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans+=fw1[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query2(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans+=fw2[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query1(x)*x + query2(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int range_query(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query(y) - query(x-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dfs_size(int x, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>size[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto &amp;i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i != p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>depth[i] = depth[x]+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>par[i] = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dfs_size(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>size[x] += size[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(size[i] &gt;= size[adjlist[x][0]]) swap(i, adjlist[x][0]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void hld(int x, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>rs[t] = x; // reverse start<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s[x] = t++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : adjlist[x]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(i != p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>nxt[i] = (i == adjlist[x][0] ? nxt[x] : i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>hld(i, x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>e[x] = t;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lca(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(nxt[a] == nxt[b]) return depth[a] &lt; depth[b] ? a : b; // same chain, check depth<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(depth[par[nxt[a]]] &lt; depth[par[nxt[b]]]) return lca(a, par[nxt[b]]); // bring b up if a is higher<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else return lca(par[nxt[a]], b); // else bring a up<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void grow(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>assert(b == lca(a, b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(nxt[a] != nxt[b]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>range_update(s[nxt[a]], s[a], 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>a = par[nxt[a]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(s[b]+1 &lt;= s[a]) range_update(s[b]+1, s[a], 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ask(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>assert(b == lca(a,b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(nxt[a] != nxt[b]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans += range_query(s[nxt[a]], s[a]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>a = par[nxt[a]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(s[b]+1 &lt;= s[a]) ans+=range_query(s[b]+1, s[a]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>freopen(&quot;.in&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n-1; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b; cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[a].push_back(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>adjlist[b].push_back(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>par[1] = 0; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>depth[1] = 1; // source of bug !!!! be careful!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>nxt[1] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dfs_size(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>hld(1, -1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>char qtype; cin &gt;&gt; qtype &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(qtype == 'P'){ // plant<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>grow(a, lca(a,b)); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>grow(b, lca(a,b));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{ // query<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout &lt;&lt; ask(a, lca(a,b)) + ask(b, lca(a,b)) &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(int i = 1; i&lt;=n; i++) printf(&quot;%d %d %d %d %d\n&quot;, s[i], e[i], nxt[i], depth[i], par[i]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Modified PushRelabel with Adjmat</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct Edge{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll cap, flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>Edge(){cap = 0, flow = 0;}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>Edge(int tar, ll capacity): cap(capacity), flow(0) {}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll amt() { return cap-flow; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct PushRelabel {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>Edge G[105][105];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; height, cnt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;bool&gt; inq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;ll&gt; excess;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>queue&lt;int&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>PushRelabel(int _N): N(_N), height(_N), cnt(2*_N), inq(_N), excess(_N){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:1'>�� </span>for(int i = 0; i&lt;=N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:2'>��������� </span>for(int j = 0; j&lt;=N; j++) G[i][j].cap = G[i][j].flow = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void AddEdge(int a, int b, ll c) {<span style='mso-spacerun:yes'>� </span>//directed edge a -&gt; b with capacity c<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (a == b) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>G[a][b].cap += c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Enqueue(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (inq[x] || excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>inq[x] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>q.push(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Push(int x, Edge *e, Edge *re, int to) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int it = to;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-spacerun:yes'>��� </span>if (height[x] &lt;= height[it]) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ll flow = min(excess[x], e-&gt;amt());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (flow == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>e-&gt;flow += flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>re-&gt;flow -=flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>excess[x] -= flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>excess[it] += flow;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>Enqueue(it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Relabel(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>--cnt[height[x]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>height[x] = 2*N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for(int i = 0; i&lt;=N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><span style='mso-tab-count:1'>����� </span>if(G[x][i].amt() == 0) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-spacerun:yes'>������ </span><span style='mso-tab-count:1'>����� </span>height[x] = min(height[x], height[i]+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>++cnt[height[x]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>Enqueue(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void GapHeuristic(int g) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 0; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (height[i] &gt;= g) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>--cnt[height[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>height[i] = max(height[i], N+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>++cnt[height[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>Enqueue(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void Discharge(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:1'>�� </span>for(int i = 0; i&lt;=N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:2'>��������� </span>Push(x, &amp;G[x][i], &amp;G[i][x], i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:2'>��������� </span>if(excess[x] == 0) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><span style='mso-tab-count:1'>�� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (cnt[height[x]] == 1) GapHeuristic(height[x]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>else Relabel(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll MaxFlow(int S, int T) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>height[S] = N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>cnt[0] = N-1, cnt[N] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>inq[S] = inq[T] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for(int i = 0; i&lt;=N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><span style='mso-tab-count:1'>����� </span>excess[S] += G[S][i].cap;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><span style='mso-tab-count:1'>����� </span>Push(S, &amp;G[S][i], &amp;G[i][S], i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>while (!q.empty()) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>int x = q.front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>q.pop(), inq[x] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>Discharge(x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return excess[T];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; MinCut(int S, int T) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>MaxFlow(S, T);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int split = N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>vector&lt;int&gt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 1; i &lt;= N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (cnt[i] == 0) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span><span style='mso-spacerun:yes'>����������</span>split = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int i = 0; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>if (height[i] &gt; split) ans.push_back(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Dinic</span></u><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:"Tahoma",sans-serif; mso-ansi-language:EN-US'>s</span></u><u><span lang=EN-US style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'> (untested, from <a href="https://gist.github.com/icyrhyme/3177630">https://gist.github.com/icyrhyme/3177630</a>)<span style='mso-spacerun:yes'>� </span>O(EV^2)<o:p></o:p></span></u></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>#define MAXN 500<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>class Dinic {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>int n, m, head[MAXN], level[MAXN], s, t, work[MAXN];<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>struct edge {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>int v, c, f, nxt;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>edge() {}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>edge(int v, int c, int f, int nxt): v(v), c(c), f(f), nxt(nxt) {}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>} e[MAXM];<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>bool _bfs() {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>static int q[MAXN];<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>memset(level, -1, sizeof(int) * n);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>int le = 0, ri = 0;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>q[ri++] = s;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>level[s] = 0;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>while(le &lt; ri) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>for(int k = q[le++], i = head[k]; i != -1; i = e[i].nxt) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>if(e[i].f &lt; e[i].c &amp;&amp; level[e[i].v] == -1) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>level[e[i].v] = level[k] + 1;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>q[ri++] = e[i].v;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>return (level[t] != -1);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span></span><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:1'>������� </span>int _dfs(int u, int f) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span></span><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>if(u == t)<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>return f;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>for(int&amp; i = work[u]; i != -1; i = e[i].nxt) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>if(e[i].f &lt; e[i].c &amp;&amp; level[u] + 1 == level[e[i].v]) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>int minf = _dfs(e[i].v, min(f, e[i].c - e[i].f));<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>if(minf &gt; 0) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>e[i].f += minf;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>e[i ^ 1].f -= minf;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>return minf;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>public:<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>void init(int nn, int src, int dst) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span></span><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'>n = nn;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span>s = src;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span>t = dst;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span></span><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>m = 0;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>memset(head, -1, sizeof(int) * n);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>void addEdge(int u, int v, int c, int rc) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span></span><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'>assert(u &lt; n);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span>assert(v &lt; n);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=DE style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:DE'><span style='mso-tab-count:2'>�������������� </span></span><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>e[m] = edge(v, c, 0, head[u]);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>head[u] = m++;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>e[m] = edge(u, rc, 0, head[v]);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>head[v] = m++;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>assert(m &lt; MAXM);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>int maxFlow() {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>int ret = 0;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>while(_bfs()) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>memcpy(work, head, sizeof(int) * n);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>while(true) {<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>int delta = _dfs(s, INF);<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>if(delta == 0)<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:5'>������������������������������������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:4'>������������������������������ </span>ret += delta;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:3'>���������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:2'>�������������� </span>return ret;<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'><span style='mso-tab-count:1'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:black; mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>DP<o:p></o:p></span></b></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LIS O(NlogN)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; lis;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(lis.empty() || A[i] &gt; lis.back()) lis.push_back(A[i]);<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:33.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>else *lower_bound(lis.begin(), lis.end(), A[i]) = A[i];<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:33.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>// dp[i] = upper_bound(lis.begin(), lis.end(), A[i]) - lis.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cout &lt;&lt; lis.size();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LIS with Parent Tracking (poklon)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// *non-decreasing variant <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pi A[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int dp[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-tab-count:1'>����� </span>freopen(&quot;poklon.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i=0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; A[i].first &gt;&gt; A[i].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(A, A+n, [](pi a, pi b){ return (a.second==b.second and a.first&lt;b.first) or a.second &gt; b.second; });<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;pi&gt; lis; // value, idx from<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int cur = A[i].first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lis.empty() or lis.back().first &lt;= cur){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(lis.empty()) dp[i] = -1; else dp[i] = lis.back().second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lis.push_back(pi(cur, i));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>auto it = lower_bound(lis.begin(), lis.end(), pi(cur, INT_MAX));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>*it = pi(cur, i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(it!=lis.begin()) dp[i] = (*prev(it)).second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>else dp[i] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; lis.size() &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int cur = lis.back().second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;pi&gt; v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cur != -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v.push_back(A[cur]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cur = dp[cur];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>reverse(v.begin(), v.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : v) cout &lt;&lt; i.first &lt;&lt; &quot; &quot; &lt;&lt; i.second &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int, int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pi A[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int p[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool cmp(int idx, int val){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return A[idx].first &lt;= val;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// <span style='mso-tab-count: 1'>��� </span>freopen(&quot;poklon.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) cin &gt;&gt; A[i].first &gt;&gt; A[i].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(A, A+n, [](pi a, pi b){ return a.second == b.second ? a.first &lt; b.first : a.second &gt; b.second; });<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; lis;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int cur = A[i].first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lis.empty() or A[lis.back()].first &lt;= cur){ // non decreasing<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>p[i] = lis.empty() ? -1 : lis.back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lis.push_back(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int loc = lower_bound(lis.begin(), lis.end(), cur, cmp) - lis.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>p[i] = loc == 0 ? -1 : lis[loc-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lis[loc] = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>} <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; lis.size() &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int cur = lis.back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cur != -1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v.push_back(cur);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cur = p[cur];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>reverse(v.begin(), v.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : v) cout &lt;&lt; A[i].first &lt;&lt; &quot; &quot; &lt;&lt; A[i].second &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Maxsum O(N)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int A[N], maxsum[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ans = maxsum[0] = A[0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for (int i = 1; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>maxsum[i] = max(maxsum[i-1] + A[i], A[i]);<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>ans = max(ans, maxsum[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int A[N];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ans = A[0], cursum = A[0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for (int i = 1; i &lt; N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>if (cursum &lt; 0) cursum = 0; <o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>cursum += A[i];<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>ans = max(ans, cursum);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>0-1 Knapsack (coinbag) O(NW)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int x, best[505][505];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int W[505], V[505];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int w;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>scanf(&quot;%d %d&quot;, &amp;x, &amp;w);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=x; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>scanf(&quot;%d %d&quot;, &amp;W[i], &amp;V[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal align=right style='text-align:right'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>memset(best, 0 , sizeof best);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int j = 1; j&lt;=x; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int n = 0; n&lt;=w; n++){<span style='mso-spacerun:yes'>� </span>// go from W[j] to w for faster<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>best [j][n] = best[j-1][n];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(n&gt;=W[j]) best[j][n] = max(best[j][n], best[j-1][n-W[j]] + V[j]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(n &gt; 0) best[j][n] = max(best[j][n-1], best[j][n]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>printf(&quot;%d&quot;, best[x][w]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>0-1 Knapsack With Repeated Items (CS3233 Qn) O(NWlogN)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef unsigned long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll S, N;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;ll, ll&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;pi, ll&gt; iii;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;iii&gt; items;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll dp[10050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cin &gt;&gt; S &gt;&gt; N){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll addon = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(S == 0 and N == 0) break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>items.clear();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>memset(dp, 0, sizeof dp);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 0; i&lt;N; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ll v,w,k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cin &gt;&gt; v &gt;&gt; w &gt;&gt; k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(w == 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>addon += v*k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int a=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>while(k &gt;= (1&lt;&lt;a)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>items.push_back(iii(pi(v,w), (1&lt;&lt;a)));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>k -= 1&lt;&lt;a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>a++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(k != 0) items.push_back(iii(pi(v,w), k));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i : items){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>int cnt = i.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>for(int k = S; k&gt;=cnt*i.first.second; k--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>dp[k] = max(dp[k-1], dp[k]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>dp[k] = max(dp[k], dp[k-cnt*i.first.second] + cnt*i.first.first);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; dp[S]+addon &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Unbounded Knapsack (untested from geeksforgeeks)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int unboundedKnapsack(int W, int n, int val[], int wt[])<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// dp[i] is going to store maximum value<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// with knapsack capacity i.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int dp[W+1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>memset(dp, 0, sizeof dp);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><span style='mso-spacerun:yes'>��</span>// Fill dp[] using above recursive formula<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (int i=0; i&lt;=W; i++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>for (int j=0; j&lt;n; j++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�������� </span>if (wt[j] &lt;= i)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>dp[i] = max(dp[i], dp[i-wt[j]]+val[j]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return dp[W];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>0-1 Knapsack MITM (harddisk)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define INF 10000000000000<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n, c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;ll, ll&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pi A[45];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll static_max[1100000];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>pi one[1100000];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-tab-count:1'>����� </span>freopen(&quot;input.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) cin &gt;&gt; A[i].first &gt;&gt; A[i].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll firsthalf = n/2;<span style='mso-spacerun:yes'>� </span>// note in actual solution its n/2-1 (to reduce memory)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;(1&lt;&lt;firsthalf); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll value = 0, weight = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int j = 0; j&lt;firsthalf; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if((1&lt;&lt;j) &amp; i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>value += A[j].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>weight += A[j].first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>one[i] = pi(weight, value);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(one, one+(1&lt;&lt;firsthalf));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(int i = 0; i&lt;(1&lt;&lt;firsthalf); i++) printf(&quot;%d: %d %d\n&quot;, i, one[i].first, one[i].second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>static_max[0] = one[0].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;(1&lt;&lt;firsthalf); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>static_max[i] = max(static_max[i-1], one[i].second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;(1&lt;&lt;(n-firsthalf)); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll value = 0, weight = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int j = 0; j&lt;n-firsthalf; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if((1&lt;&lt;j) &amp; i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>value += A[j+firsthalf].second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>weight += A[j+firsthalf].first;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<span style='mso-tab-count:1'>����� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int idx = upper_bound(one, one+(1&lt;&lt;firsthalf), pi(c-weight, INF))-one-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(idx &lt; 0) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = max(ans, static_max[idx] + value);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Coin Change (mincoins) (moneychanger)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int N, V, coins[10001], value[10001];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main() <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cin &gt;&gt; N &gt;&gt; V;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 0; i &lt; N; i++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>cin &gt;&gt; coins[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>value[0] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 1; i&lt;=V; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>value[i] = INT_MAX;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>for(int j = 0; j&lt;N; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if(i&gt;=coins[j] and value[i-coins[j]]!=INT_MAX) <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>value[i] = min(value[i],value[i-coins[j]]+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(value[V] == INT_MAX) cout &lt;&lt; -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�� </span><span style='mso-spacerun:yes'>�</span>else cout&lt;&lt;value[V];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Coin Change (ways)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,v, coins[55], ways[10050]; //value, index of minimum coin<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>scanf(&quot;%d %d&quot;, &amp;n, &amp;v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=n; ++i) scanf(&quot;%d&quot;, &amp;coins[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>ways[0] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = 1; j&lt;=v; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(j&gt;=coins[i]) ways[j]+=ways[j-coins[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>ways[j]%=13371337;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>cout &lt;&lt; ways[v] % 13371337;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal style='text-align:justify;text-justify:inter-ideograph'><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p><span style='text-decoration:none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>2D Maxsum (orchard)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>const int maxh = 155, maxw = 100050;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int h, w;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int grid[maxh][maxw];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ss[maxh][maxw];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x, int y1, int y2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return ss[y2][x] - ss[y1-1][x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int ctr = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>scanf(&quot;%d %d&quot;, &amp;h, &amp;w);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=h; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = 1; j&lt;=w; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>int hi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>scanf(&quot;%d&quot;, &amp;hi);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if (hi == 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>grid[i][j] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ctr++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>grid[i][j] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=w; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = 1; j&lt;=h; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>ss[j][i] = ss[j-1][i] + grid[j][i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 1; i&lt;=h; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = i; j&lt;=h; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>int cur = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>for(int k = 1; k &lt;= w; ++k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������� </span>if(cur&lt;0) cur=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>cur += query(k, i, j);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������ </span><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ans = max(ans, cur);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>printf(&quot;%d\n&quot;, ctr-ans);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Maxsum from one corner to every point (morefun)</span></u><span lang=EN-US style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>cur=best=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cur += A[i][1]-A[i-1][1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(cur &lt; 0) cur = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>best = max(best, cur);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>fromTL[i][1] = best;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int j = 2; j&lt;=m; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++) fromTL[i][j] = fromTL[i][j-1]; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;=j; k++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cur=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>best=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cur += query(i, k, i, j);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(cur &lt; 0) cur = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>best = max(cur, best);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>fromTL[i][j] = max(fromTL[i][j], best);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Longest Common Subsequence<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lcs(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(x == -1 || y == -1) mug[x][y] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>else if(mug[x][y] != -1) return mug[x][y];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>else if(a[x] == b[y]) mug[x][y]=lcs(x-1, y-1)+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>else mug[x][y] = max(lcs(x, y-1), lcs(x-1, y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return mug[x][y];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>scanf(&quot;%s %s&quot;, &amp;a, &amp;b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 0; i&lt;1005; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = 0; j&lt;1005; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>mug[i][j] = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>cout &lt;&lt; lcs(strlen(a), strlen(b))-1 &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Count Subsequences (b in a)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>cin&gt;&gt;a&gt;&gt;b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n = a.length(); int m = b.length();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int i = 0; i&lt;=n; i++) dp[i][0] = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int j = 1; j&lt;=m; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dp[i][j] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(a[i-1] == b[j-1]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dp[i][j] += dp[i-1][j-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dp[i][j] += dp[i-1][j];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>//for(int i = 1; i&lt;=n; i++) printf(&quot;%d &quot;, dp[i][j] - dp[i-1][j]); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>cout &lt;&lt; dp[n][m];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Edit distance (untested)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US;mso-no-proof:yes'><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="Picture_x0020_2" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:256pt;height:86pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="NOI%20Ref.fld/image001.png" o:title=""/> </v:shape><![endif]--><![if !vml]><img border=0 width=256 height=86 src="NOI%20Ref.fld/image001.png" v:shapes="Picture_x0020_2"><![endif]></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>char A[1001], B[1001]; // null characters, remember<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int N, M, edit[1001][1001];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for (int i = 0; i &lt;= N; ++i) {<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>for (int j = 0; j &lt;= M; ++j) {<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if (i == 0 || j == 0) edit[i][j] = max(i, j);<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>if (A[i - 1] == B[j - 1]) edit[i][j] = edit[i - 1][j - 1];<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>else edit[i][j] = edit[i - 1][j - 1] + 1; // substitution<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>edit[i][j] = min(edit[i][j], edit[i - 1][j]); // insertion<o:p></o:p></span></p> <p class=MsoNormal style='margin-left:36.0pt;text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>edit[i][j] = min(edit[i][j], edit[i][j - 1]); // deletion<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>L Hull (Max) (Increasing Gradient, Increasing Query)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>deque&lt;pi&gt; dq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int y(pi line, int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return line.first * x + line.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(dq.size()&gt;1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y(dq[0],x) &lt; y(dq[1],x)) dq.pop_front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else return y(dq[0], x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return y(dq[0],x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>double intersect(int m1, int c1, int m2, int c2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return (double)(c2-c1)/(m1-m2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>double intersect(pi p1, pi p2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return intersect(p1.first, p1.second, p2.first, p2.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void insert(int m, int c){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pi line = pi(m,c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(dq.size()&gt;1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int s = dq.size();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(intersect(dq[s-1], line)&lt;=intersect(dq[s-2], line)) dq.pop_back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dq.push_back(line);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Hull (Min) (Decreasing Gradient, Increasing Query)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>deque&lt;pi&gt; dq;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int y(pi line, int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return line.first * x + line.second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(dq.size()&gt;1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y(dq[0],x) &gt;= y(dq[1],x)) dq.pop_front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return y(dq[0], x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>double intersect(int m1, int c1, int m2, int c2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return (double) (c2-c1)/(m1-m2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>double intersect(pi p1, pi p2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return intersect(p1.first, p1.second, p2.first, p2.second);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void insert(int m, int c){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pi line = pi(m,c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(dq.size()&gt;1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int s = dq.size();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(intersect(dq[s-1], line) &lt;= intersect(dq[s-2], line)) dq.pop_back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dq.push_back(line);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>General Convex Hull</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct Line{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll m, c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>long double left;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>enum Type {line, query} type;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll x; // for query<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>Line(){}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>Line(ll mm, ll cc){ m = mm; c = cc; left = 0.0;}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>friend ll val(Line a, ll x){ return x*a.m + a.c; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>friend void printline(Line a){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>printf(&quot;%d x + %d, %0.1f\n&quot;, a.m, a.c, a.left);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>friend long double intersect(Line a, Line b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(a.m == b.m) return inf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return (long double) (a.c-b.c)/ (long double) (b.m-a.m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool operator&lt;(const Line &amp;a) const{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(a.type == line) return this-&gt;m &lt; a.m; // sort by ascending gradient<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else return this-&gt;left &lt; (long double) a.x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct ConvexHull{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>typedef set&lt;Line&gt;::iterator sit;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>set&lt;Line&gt; ch;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool hasPrev(sit it){ return it != ch.begin(); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool hasNext(sit it){ return it != ch.end() and it != prev(ch.end()); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool use(Line a, Line b, Line c){ return intersect(a,b) &lt;= intersect(a,c); } // B is useful or not<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>bool use(sit a){ return !hasPrev(a) or !hasNext(a) or use(*prev(a), *a, *next(a)); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sit updateLeft(sit a){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>Line copy = *a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(a == ch.begin()) copy.left = -dinf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>copy.left = intersect(*prev(a), *a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto it = ch.erase(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>it = ch.insert(it, copy);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return it;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void printlines(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i : ch) printline(i); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void addLine(Line a){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(debug) printf(&quot;adding %d x + %d\n&quot;, a.m, a.c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto it = ch.lower_bound(Line(a.m, -inf));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(it!=ch.end() and it-&gt;m == a.m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(it-&gt;c &gt; a.c) ch.erase(it); // tainter one delete<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>else return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>it = ch.insert(it, a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!use(it)){ ch.erase(it); return; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(hasPrev(it) and !use(prev(it))) ch.erase(prev(it));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(hasNext(it) and !use(next(it))) ch.erase(next(it));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>it = updateLeft(it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(hasPrev(it)) updateLeft(prev(it));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(hasNext(it)) updateLeft(next(it));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(debug) printlines();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll query(ll x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>Line q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>q.x = x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>q.type = Line::Type::query;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sit it = ch.lower_bound(q);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(hasPrev(it)) it=prev(it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return val((*it), x);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Divide and Conquer (e.g. guards) O(N log N) per row<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void dnc(int s, int e, int x, int y, int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span>dp[m][k] = INF;<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>for(int i = x; i&lt;=y; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(dp[m][k]&gt;dp[i][k-1] + cost(i+1,m)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dp[m][k] = dp[i][k-1]+cost(i+1, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>opt[m][k] = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(s&lt;m) dnc(s, m-1, x, opt[m][k], k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>if(m&lt;e) dnc(m+1, e, opt[m][k], y, k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// usage: for each k, call dnc(1,n,1,n,k)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Sliding Set (diversity)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n,k,A[5000050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>freopen(&quot;input.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>multiset&lt;int&gt; ss;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s = 0, e = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(e&lt;n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while((ss.empty() or *(ss.rbegin()) - *(ss.begin()) &lt; k) and e&lt;n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>//<span style='mso-tab-count: 3'>������������������ </span>printf(&quot;e : %d\n&quot;, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:3'>��������������������� </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>ss.insert(A[e++]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(e &gt;= n) break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(s &lt; e and !ss.empty() and *(ss.rbegin()) - *(ss.begin()) &gt;= k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 3'>������������������ </span>printf(&quot;s : %d\n&quot;, s);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ans+=n-e+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ss.erase(ss.find(A[s++]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(s&lt;n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(*(ss.rbegin()) - *(ss.begin()) &gt;= k) ans++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ss.erase(ss.find(A[s++]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Sliding Deque (min and max)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>deque&lt;int&gt; dmin, dmax;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void insert(int val){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(!dmin.empty() and dmin.back() <b style='mso-bidi-font-weight: normal'>&gt;</b> val) dmin.pop_back(); // note </span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;mso-ascii-font-family:Calibri; mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-ansi-language: EN-US'>�</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:Menlo;mso-ansi-language:EN-US'>gt;�!!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dmin.push_back(val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(!dmax.empty() and dmax.back() <b style='mso-bidi-font-weight: normal'>&lt;</b> val) dmax.pop_back();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>dmax.push_back(val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void erase(int val){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(!dmin.empty() and dmin.front() == val) dmin.pop_front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(!dmax.empty() and dmax.front() == val) dmax.pop_front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int mmin(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return dmin.front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int mmax(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return dmax.front();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool empty(){ return dmax.empty() and dmin.empty(); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Kth Lexicographical (z-01paths)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void calc(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>char cur = 'A';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = n; i&gt;=1; i--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(ll j = 0; j&lt;=1; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>char temp = cur;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(j == 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>if(cur == 'A') temp = 'C';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'B') temp = 'D';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'C') temp = 'A';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'D') temp = 'B';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>if(cur == 'A') temp = 'B';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'B') temp = 'A';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'C') temp = 'D';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>else if(cur == 'D') temp = 'C';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ll ret = count(temp, i-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret = ret==0?-1:ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(ret == -1) continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(k &lt;= ret){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>ans += (char) (j+'0');<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>cur = temp;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}else k-=ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Data Structures<o:p></o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Fenwick Tree PURQ<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Update: O(log N)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Query: O(log N)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int fw[N+1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update(int p, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=n;p+=p&amp;(-p)) fw[p] += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans+=fw[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Fenwick Tree RUPQ<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void rangeUpdate(int a, int b, int v){ <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(a, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(b+1, -v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int pointQuery(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query(p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Fenwick Tree RURQ!</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int fw[N+1], fw2[N+1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update(int * A, int p, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p&lt;=n;p+=p&amp;(-p)) A[p] += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int * A, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(;p;p-=p&amp;(-p)) ans+=A[p];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int prefixSum(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query(fw, p)*p + query(fw2, p); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void rangeUpdate(int a, int b, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(fw, a, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(fw, b+1, -v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(fw2, a, -v*(a-1));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>update(fw2, b+1, v*b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int rangeQuery(int a, int b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return prefixSum(b) - prefixSum(a-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>2D Fenwick<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>int fw[2005][2005];<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>int n,m,q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void update(int x, int y, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int tx=x; tx&lt;=n; tx+=tx&amp;(-tx)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int ty=y; ty&lt;=m; ty+=ty&amp;(-ty)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>fw[tx][ty] += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int tx=x; tx; tx-=tx&amp;(-tx)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int ty=y; ty; ty-=ty&amp;(-ty)){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ans+=fw[tx][ty];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int rangequery(int x1, int y1, int x2, int y2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Standard Segment Tree<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s, e, m, maxv, minv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(int ss, int ee){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = ss; e = ee;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>minv = maxv = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s != e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>l = new node(s,m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span></span><span lang=DE style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>r = new node(m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:2'>������������� </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update(int p, int nv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>minv = maxv = nv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p &lt;= m) l-&gt;update(p, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else r-&gt;update(p, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>maxv = max(l-&gt;maxv, r-&gt;maxv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:2'>������������� </span>minv = min(l-&gt;minv, r-&gt;minv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int querymin(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x == s and e == y) return minv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &gt; m) return r-&gt;querymin(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y &lt;= m) return l-&gt;querymin(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return min(l-&gt;querymin(x,m), r-&gt;querymin(m+1,y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int querymax(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x == s and e == y) return maxv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &gt; m) return r-&gt;querymax(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y &lt;= m) return l-&gt;querymax(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return max(l-&gt;querymax(x,m), r-&gt;querymax(m+1, y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} *root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>root = new node(0, N-1); // init<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>root -&gt; update(1,5); // update<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; root -&gt; querymin(1,3) &lt;&lt; </span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;mso-ascii-font-family: Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-ansi-language: EN-US'>�</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:Menlo;mso-ansi-language:EN-US'>n</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;mso-ascii-font-family:Calibri; mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-ansi-language: EN-US'>�</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:Menlo;mso-ansi-language:EN-US'> // query<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>OR<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct SegmentTree{ // RMQ ST<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int A[200050]; // careful about array bounds! (2*2^ceil(log2(N))+1)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>SegmentTree(int nn){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>n = nn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update_r(int s, int e, int p, int v, int i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p&lt;s or p&gt;e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s==e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>A[i] = v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update_r(s,m,p,v,2*i+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update_r(m+1,e,p,v,2*i+2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>A[i] = min(A[2*i+1], A[2*i+2]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query_r(int s, int e, int x, int y, int i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &lt;= s and y &gt;= e) return A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &gt; e or y &lt; s) return inf;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return min(query_r(s,m,x,y,2*i+1), query_r(m+1,e,x,y,2*i+2));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update(int p, int v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>update_r(0, n, p, v, 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return query_r(0, n, x, y, 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Lazy Propogation ST <o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int s, e, m, v, lazyadd;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node(int _s, int _ e): s(_s), e(_e), m((_s+_e)/2), v(0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s!=e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>l = new node(s, m); r = new node (m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int value(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>v += lazyadd; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>lazyadd = 0; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>r -&gt; lazyadd += lazyadd; l -&gt; lazyadd += lazyadd;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>v+=lazyadd;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>lazyadd = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>void add(int x, int y, int val){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == x and e == y) lazyadd += val;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(x &gt; m) r-&gt; add(x, y, val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>else if(y &lt;= m) l -&gt; add(x,y, val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>else l -&gt; add(x,m,val), r-&gt;add(m+1,y,val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>v = max(l-&gt;value(), r-&gt;value());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><span style='mso-spacerun:yes'>�</span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int rmq(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == x and e == y) return value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(x &gt; m) return r-&gt;rmq(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else if(y &lt;= m) return l-&gt;rmq(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return max(l-&gt;rmq(x,m), r-&gt;rmq(m+1,y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Memory Efficient ST<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node(int s, int e): v(0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s!=e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>l = new node(s, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span></span><span lang=DE style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>r = new node(m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>��� </span></span><span lang=EN-US style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>void update(int s, int e, int x, int nv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><span style='mso-spacerun:yes'>����</span>v = nv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(x &lt;= m) l-&gt;update(s, m, x, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span></span><span lang=DE style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>else r-&gt;update(m+1, e, x, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>��� </span>v = min(l-&gt;v, r-&gt;v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>� </span>int rmq(int s, int e, int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>��� </span>// printf(&quot;%d %d %d %d\n&quot;, s, e, x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>��� </span></span><span lang=EN-US style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>if(s == x and e == y) return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(x &gt; m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return r-&gt;rmq(m+1, e, x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}else if(y &lt;= m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return l-&gt;rmq(s,m, x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return min(l-&gt;rmq(s,m,x,m), r-&gt;rmq(m+1,e,m+1,y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root;<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Bananafarm Segment Tree<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int A[200050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int s, e, m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>vector&lt;int&gt; v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>node(int _s, int _e): s(_s), e(_e), m((_s+_e)/2), v(0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>v.push_back(A[s]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>l = new node(s, m); r = new node (m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int i = 0, j = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; left = l-&gt;v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; right = r-&gt;v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while(i &lt; left.size() or j &lt; right.size()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(i == left.size()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>v.push_back(right[j++]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}else if(j == right.size()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>v.push_back(left[i++]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if(left[i] &lt; right[j]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������� </span>v.push_back(left[i++]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������� </span>v.push_back(right[j++]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int countabove(int x, int y, int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(s == x and e == y) return v.end()-lower_bound(v.begin(),v.end(),k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(x &gt; m) return r-&gt;countabove(x,y,k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(y &lt;= m) return l-&gt;countabove(x,y,k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return l-&gt;countabove(x,m,k) + r-&gt;countabove(m+1,y,k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n, biggestguy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int getplace(int x, int y, int p){ // in range [x,y], get the p-th biggest guy<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int s = 0; int e = biggestguy + 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>while(m = (s+e)/2, e-s&gt;1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(root -&gt; countabove(x,y,m) &gt;= p) s = m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else e = m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>biggestguy = max(biggestguy, A[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>root = new node(0,n-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>// root -&gt; printst();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int a,b,c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>a--;b--;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cout &lt;&lt; getplace(a,b,c) &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Range Set Point Query (from bstmaintenance)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>*Take note: lazy propagate before updating! (was a bug)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool lazyprop = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s,e,m,v,lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(int ss, int ee){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = ss, e = ee; m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>lazy = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = new node(s, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>r = new node(m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int value(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>v=lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lazy=-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lazy == -1) return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l-&gt;lazy = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>r-&gt;lazy = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>lazy = -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void pointupdate(int x, int nv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>v = nv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &lt;= m) l-&gt;pointupdate(x, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else r-&gt;pointupdate(x, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void update(int x, int y, int nv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(!lazyprop) for(int i = x; i&lt;=y; i++) pointupdate(i, nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lazyprop){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(s == x and e == y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span><span style='mso-spacerun:yes'>�</span>lazy = nv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span><span style='mso-spacerun:yes'>�</span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(y&lt;=m) l-&gt;update(x,y,nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>else if(x&gt;m) r-&gt;update(x,y,nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>l-&gt;update(x,m,nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>r-&gt;update(m+1,y,nv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query(int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lazyprop) value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>if(!lazyprop) return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p &lt;= m) return l-&gt;query(p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else return r-&gt;query(p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Range Set Range Sum Query<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// a range set range sum query segment tree<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s, e, v, lazy, m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(int ss, int ee){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = ss, e = ee;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v = lazy = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = new node(s, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>r = new node(m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int value(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(lazy == 0) return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>v = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lazy = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v = (e-s+1) * lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l-&gt;lazy = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>r-&gt;lazy = lazy;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>lazy = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>void range_set(int x, int y, int newv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == x and e == y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>lazy = newv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y &lt;= m) l-&gt;range_set(x,y,newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else if(x &gt; m) r-&gt;range_set(x,y,newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>l-&gt;range_set(x,m,newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>r-&gt;range_set(m+1,y,newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v = l-&gt;value()+r-&gt;value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int range_query(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x == s and e == y) return value();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(y &lt;= m) return l-&gt;range_query(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>else if(x &gt; m) return r-&gt;range_query(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return l-&gt;range_query(x,m) + r-&gt;range_query(m+1,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ST from Noiref (untested):<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int s, e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll mn, mx, sum;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>bool lset;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll add_val, set_val;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>node (int _s, int _e, int A[] = NULL): s(_s), e(_e), mn(0), mx(0), sum(0), lset(0), add_val(0), set_val(0), l(NULL), r(NULL) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (A == NULL) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><span style='mso-spacerun:yes'>������</span>if (s == e) mn = mx = sum = A[s];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>else {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>l = new node(s, (s+e)&gt;&gt;1, A), r = new node((s+e+2)&gt;&gt;1, e, A);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>combine();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void create_children() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (l != NULL) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>l = new node(s, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span></span><span lang=DE style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>r = new node(m+1, e);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>��� </span></span><span lang=EN-US style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void self_set(ll v) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>lset = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>mn = mx = set_val = v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>sum = v * (e-s+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>add_val = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void self_add(ll v) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (lset) { self_set(v + set_val); return; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>mn += v, mx += v, add_val += v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>sum += v*(e-s+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void lazy_propagate() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (lset) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>l-&gt;self_set(set_val), r-&gt;self_set(set_val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>lset = set_val = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<span style='mso-spacerun:yes'>�� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (add_val != 0) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>l-&gt;self_add(add_val), r-&gt;self_add(add_val);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>add_val = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void combine() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (l == NULL) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>sum = l-&gt;sum + r-&gt;sum;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span></span><span lang=DE style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:DE'>mn = min(l-&gt;mn, r-&gt;mn);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-spacerun:yes'>������� </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>mx = max(l-&gt;mx, r-&gt;mx);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void add(int x, int y, ll v) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == x &amp;&amp; e == y) { self_add(v); return; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>create_children(); lazy_propagate();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x &lt;= m) l-&gt;add(x, min(y, m), v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (y &gt; m) r-&gt;add(max(x, m+1), y, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>combine();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>void set(int x, int y, ll v) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == x &amp;&amp; e == y) { self_set(v); return; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>create_children(); lazy_propagate();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x &lt;= m) l-&gt;set(x, min(y, m), v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (y &gt; m) r-&gt;set(max(x, m+1), y, v);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>combine();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll range_sum(int x, int y) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == x &amp;&amp; e == y) return sum;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������ </span><span style='mso-spacerun:yes'>�</span>if (l == NULL || lset) return (sum / (e-s+1)) * (y-x+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>lazy_propagate();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (y &lt;= m) return l-&gt;range_sum(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x &gt; m) return r-&gt;range_sum(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return l-&gt;range_sum(x, m) + r-&gt;range_sum(m+1, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll range_min(int x, int y) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == x &amp;&amp; e == y) return mn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (l == NULL || lset) return mn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>lazy_propagate();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (y &lt;= m) return l-&gt;range_min(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x &gt; m) return r-&gt;range_min(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return min(l-&gt;range_min(x, m), r-&gt;range_min(m+1, y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ll range_max(int x, int y) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (s == x &amp;&amp; e == y) return mx;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (l == NULL || lset) return mx;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int m = (s+e)&gt;&gt;1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>lazy_propagate();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (y &lt;= m) return l-&gt;range_max(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x &gt; m) return r-&gt;range_max(x, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return max(l-&gt;range_max(x, m), r-&gt;range_max(m+1, y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>~node() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (l != NULL) delete l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (r != NULL) delete r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} *root;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root = new node(0, N-1, array); //creates a segment tree with elements 0 to N - 1. The array parameter is optional.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root = new node(0, 1000000000); //this tree supports lazy node creation and propagation too, declare as much as you like :)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;add(0, 5000, 3);<span style='mso-spacerun:yes'>��� </span>//add 3 to range [0, 5000]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;add(3000, 9000, -2); //minus 2 to range [3000, 9000]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;set(7000, 10000, 5);<span style='mso-spacerun:yes'>��� </span>//set range [7000, 10000] to 5<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>/* at this point, 0 to 2999 is 3, 3000 to 5000 is 1, 5001 to 6999 is -2, 7000 to 10000 is 5 */<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;range_max(0, 10000);<span style='mso-spacerun:yes'>��� </span>//returns 5<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;range_min(0, 10000);<span style='mso-spacerun:yes'>��� </span>//returns -2<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>root-&gt;range_sum(0, 10000);<span style='mso-spacerun:yes'>��� </span>//returns 22008#include &lt;iostream&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>std::cout &lt;&lt; &quot;Hello World!\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Suffix Array<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define csize 100050<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int sa[100050], ra[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int tempsa[100050], tempra[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string suffix[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void printtable(int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// print i, sa[i], suffix, ra[sa[i]], ra[sa[i]+k]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;i&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;sa[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(20); cout&lt;&lt;left&lt;&lt;&quot;suffix[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(10); cout&lt;&lt;left&lt;&lt;&quot;ra[sa[i]]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(10); cout&lt;&lt;left&lt;&lt;&quot;ra[sa[i]+k]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;sa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(20); cout&lt;&lt;left&lt;&lt;suffix[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]+k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int c[csize];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void countingsort(int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>memset(c, 0, sizeof c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>c[sa[i]+k &lt; n ? ra[sa[i]+k] : 0]++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int sum=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;csize; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int t = c[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>c[i] = sum;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sum += t;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>tempsa[c[sa[i]+k &lt; n ? ra[sa[i]+k] : 0]++] = sa[i]; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) sa[i] = tempsa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void builtsa(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;n; k&lt;&lt;=1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>countingsort(k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>countingsort(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int r=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>tempra[0] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 1; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>tempra[sa[i]] = (ra[sa[i]] == ra[sa[i-1]] and ra[sa[i]+k] == ra[sa[i-1]+k] ? r : ++r);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 0; i&lt;n; i++) ra[i] = tempra[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(ra[sa[n-1]] == n-1) break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>//printtable(k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s = &quot;abaaabaaabaaabbbb&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s+=&quot;$&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>n = s.length();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>suffix[i] = s.substr(i, n-i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sa[i] = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ra[sa[i]] = suffix[i][0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>builtsa();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int k = 4;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(20); cout&lt;&lt;left&lt;&lt;suffix[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]+k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]+2*k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>printtable(4);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LCP Array (untested)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define csize 100050<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int sa[100050], ra[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int tempsa[100050], tempra[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lcp[100050], phi[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string suffix[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool debug_lcp = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void printtable(int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// print i, sa[i], suffix, ra[sa[i]], ra[sa[i]+k]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;i&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;sa[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(20); cout&lt;&lt;left&lt;&lt;&quot;suffix[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(9); cout&lt;&lt;left&lt;&lt;&quot;lcp[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(debug_lcp){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;|&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;i&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(9); cout&lt;&lt;left&lt;&lt;&quot;phi[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(20); cout&lt;&lt;left&lt;&lt;&quot;suffix[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;sa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><span style='mso-tab-count:1'>������ </span>cout.width(20); cout&lt;&lt;left&lt;&lt;suffix[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(9); cout&lt;&lt;left&lt;&lt;lcp[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(debug_lcp){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;|&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout.width(9); cout&lt;&lt;left&lt;&lt;phi[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout.width(20); cout&lt;&lt;left&lt;&lt;suffix[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int c[csize];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void countingsort(int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>memset(c, 0, sizeof c);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>c[sa[i]+k &lt; n ? ra[sa[i]+k] : 0]++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int sum=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;csize; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int t = c[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>c[i] = sum;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sum += t;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>tempsa[c[sa[i]+k &lt; n ? ra[sa[i]+k] : 0]++] = sa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) sa[i] = tempsa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int plcp[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void builtsa(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int k = 1; k&lt;n; k&lt;&lt;=1){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>countingsort(k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>countingsort(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int r=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>tempra[0] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 1; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>tempra[sa[i]] = (ra[sa[i]] == ra[sa[i-1]] and ra[sa[i]+k] == ra[sa[i-1]+k] ? r : ++r);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 0; i&lt;n; i++) ra[i] = tempra[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(ra[sa[n-1]] == n-1) break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>//printtable(k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) phi[sa[i]] = (i==0?-1:sa[i-1]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int l = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(phi[i] == -1){ plcp[i] = 0; continue; }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>while(s[i+l] == s[phi[i]+l]) ++l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>plcp[i] = l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = max(l-1, 0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++) lcp[i] = plcp[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s = &quot;abaaabaaabaaabbbb&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s+=&quot;$&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>n = s.length();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>suffix[i] = s.substr(i, n-i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>sa[i] = i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ra[sa[i]] = suffix[i][0];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>builtsa();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>printtable(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Persistent UFDS (fatnode)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef pair&lt;int,int&gt; pi;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; p[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;pi&gt; size[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int par(int x, int t){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>auto it = prev(upper_bound(p[x].begin(), p[x].end(), pi(t,inf)));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(x == (*it).second) return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return par((*it).second,t);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int getsize(int x, int t){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>x = par(x,t);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>auto it = prev(upper_bound(size[x].begin(), size[x].end(), pi(t,inf)));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return (*it).second;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void merge(int a, int b, int t){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ap = par(a,t), bp = par(b,t);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int as = getsize(ap,t), bs=getsize(bp,t);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(as &gt; bs) swap(ap, bp); // union by rank (impt!)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>p[ap].push_back(pi(t,bp));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>size[bp].push_back(pi(t,bs+as));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool sameset(int a, int b, int t){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return par(a,t) == par(b,t);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Persistent ST (mkthnum)</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s,e,m,v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node(int ss, int ee, bool prop){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = NULL;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>r = NULL;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = ss;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>e = ee;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>v=0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<span style='mso-tab-count:1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(prop){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>l = new node(s,m,prop);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>r = new node(m+1,e,prop);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node * update(int p, int newv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>node * ret = new node(s,e,false);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret-&gt;v = newv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p &lt;= m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret-&gt;l = l-&gt;update(p, newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret-&gt;r = r; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret-&gt;l = l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ret-&gt;r = r-&gt;update(p, newv);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ret-&gt;v = ret-&gt;l-&gt;v + ret-&gt;r-&gt;v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ret;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} * root[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,q,A[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int x, int y, int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node * yroot = root[y];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>node * xroot = root[x];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s=0, e=n-1, m; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(m=(s+e)/2,s!=e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int frontval = yroot-&gt;l-&gt;v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int backval = xroot-&gt;l-&gt;v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int leftval = frontval-backval;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(k &lt;= leftval){ // k is in the left subtree<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>yroot = yroot-&gt;l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>xroot = xroot-&gt;l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>e=m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>k -= leftval;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>yroot = yroot-&gt;r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>xroot = xroot-&gt;r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>s=m+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; pos;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>pos.push_back(A[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(pos.begin(), pos.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>root[0] = new node(0, n-1, true);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int idx = lower_bound(pos.begin(), pos.end(), A[i])-pos.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>root[i] = root[i-1]-&gt;update(idx, 1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; pos[query(a-1,b,k)] &lt;&lt; '\n';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>With arrays (stockexchange)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n,m,A[100009];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int nn=1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct node{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int l,r,v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} tree[100009*20]; // N log N<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int root[100005];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int create(int ll, int rr, int vv){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>tree[nn].l = ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>tree[nn].r = rr;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>tree[nn].v = vv;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return nn++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>} <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void insert(int &amp;root, int proot, int s, int e, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>root = create(tree[proot].l, tree[proot].r, tree[proot].v+1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(s == e) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(p&lt;=m) insert(tree[root].l, tree[proot].l, s, m, p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else insert(tree[root].r, tree[proot].r, m+1, e, p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int query(int t1, int t2, int p){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(p == -1) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s = 0, e = n, m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int one = root[t1], two = root[t2];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(true){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ans += tree[two].v - tree[one].v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(p &lt;= m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>e = m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>one = tree[one].l, two = tree[two].l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ans += tree[tree[two].l].v - tree[tree[one].l].v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>one = tree[one].r, two = tree[two].r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>s = m+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// <span style='mso-tab-count: 1'>��� </span>freopen(&quot;stockexchange.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ios_base::sync_with_stdio(false);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cin.tie(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; discrete;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// how to settle init tree?<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// ans: solved implicitly because of 0-self reference, gug zhencongming :o<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>discrete.push_back(A[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(discrete.begin(), discrete.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int p = lower_bound(discrete.begin(), discrete.end(), A[i]) - discrete.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>insert(root[i], root[i-1], 0, n, p);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int ans = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(m--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c,d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b &gt;&gt; c &gt;&gt; d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>c += ans, d+=ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>a--;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int ci=lower_bound(discrete.begin(), discrete.end(), c)-discrete.begin()-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int di=upper_bound(discrete.begin(), discrete.end(), d)-discrete.begin()-1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = query(a,b,di)-query(a,b,ci);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; ans &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Sparse Table &lt;O(NlogN), O(1)&gt;<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int st[11][505];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void build(int n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int h = floor(log2(n));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int j = 0; j&lt;n; j++) st[0][j] = A[j]; //array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=h; i++) <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int j = 0; j+(1&lt;&lt;i)&lt;=n; j++) // 0-indexed<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>st[i][j] = min(st[i-1][j], st[i-1][j+(1&lt;&lt;(i-1))]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int rangemin(int l, int r){ // <b style='mso-bidi-font-weight:normal'>[l, r)<o:p></o:p></b></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int p = 31-__builtin_clz(r-l);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return min(st[p][l], st[p][r-(1&lt;&lt;p)]); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Wavelet Tree : query(range, kth number) (mkthnum)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define inf INT_MAX<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int A[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct wavelet{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int s,e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet(int *from, int *to, int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = x, e = y;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e or from&gt;=to) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto f = [m](int x){ return x &lt;= m; };<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>b.push_back(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i = from; i&lt;to; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>b.push_back(b.back() + f(*i));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto split = stable_partition(from, to, f);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = new wavelet(from, split, x, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>r = new wavelet(split, to, m+1, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query(int x, int y, int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(x &gt; y) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e) return s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int inleft = b[y] - b[x-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(inleft &gt;= k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// go left<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// place in left == no. elements left of me (in array) that go left + 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>//<span style='mso-tab-count:2'>����������� </span> == b[x-1] + 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-tab-count:1'>������ </span>return l-&gt;query(b[x-1]+1, b[y], k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// go right<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// place in right == no. elements left of me (in array) that go right + 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>// <span style='mso-tab-count:2'>���������� </span><span style='mso-spacerun:yes'>��</span>== index - 1 - b[i-1] + 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>//<span style='mso-tab-count:2'>����������� </span><span style='mso-spacerun:yes'>� </span>== index - b[i-1]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return r-&gt;query(x-b[x-1], y-b[y], k-inleft);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n, q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ios_base::sync_with_stdio(false);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin.tie(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>freopen(&quot;mkthnum.txt&quot;, &quot;r&quot;, stdin); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++) cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;int&gt; discrete;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++) discrete.push_back(A[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(discrete.begin(), discrete.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 1; i&lt;=n; i++) A[i] = lower_bound(discrete.begin(), discrete.end(), A[i]) - discrete.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet *root = new wavelet(A+1, A+n+1, 0, n-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,b,c; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; discrete[root-&gt;query(a,b,c)] &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Wavelet Tree : query(LTE, SLTE) (fastsort)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define mod 1000000007<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll A[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll B[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;ll&gt; discrete;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll n,q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// self-implemented: slte (sum less than equal)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// we hence needed to use extra array B to store the original non-discretize value<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct wavelet{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll s,e;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;ll&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;ll&gt; ss;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet *l, *r;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet(ll *from, ll *to, ll x, ll y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>s = x, e = y;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ss.push_back(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(s == e or from &gt;= to){ // either single value, or out of range<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>for(auto i = from; i&lt;to; ++i) ss.push_back((ss.back() + B[i-A]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll m = (s+e)/2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto f = [m](ll x){ return x &lt;= m; };<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto f2 = [m](ll x){ return x&lt;=discrete[m]; };<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>b.push_back(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i = from; i&lt;to; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>b.push_back(b.back() + f(*i));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(auto i = from; i&lt;to; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ss.push_back((ss.back() + B[i - A]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 2'>����������� </span>printf(&quot;A : &quot;); for(auto i = from; i&lt;to; i++) printf(&quot;%d &quot;, *i); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 2'>����������� </span>printf(&quot;B : &quot;); for(auto i = from; i&lt;to; i++) printf(&quot;%d &quot;, B[i-A]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 2'>����������� </span>printf(&quot;SS: &quot;); for(ll i = 1; i&lt;ss.size(); i++) printf(&quot;%d &quot;, ss[i]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>auto split = stable_partition(from, to, f);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>stable_partition(&amp;B[from-A], &amp;B[to-A], f2); // B is a poller, from is poller, A is poller<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>l = new wavelet(from, split, x, m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>r = new wavelet(split, to, m+1, y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll lte(ll l, ll r, ll k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(l &gt; r or k &lt; s) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(k &gt;= e) return r-l+1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll lb = b[l-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll rb = b[r];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return (this-&gt;l-&gt;lte(lb+1, rb, k) + this-&gt;r-&gt;lte(l-lb, r-rb, k));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll slte(ll l, ll r, ll k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(l &gt; r or k &lt; s) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(k &gt;= e) return (ss[r] - ss[l-1]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll lb = b[l-1];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll rb = b[r];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll ans = (this-&gt;l-&gt;slte(lb+1, rb, k) % mod + this-&gt;r-&gt;slte(l-lb, r-rb, k) % mod);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ans % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll dp[5005][5005];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll copyA[100050], copyB[100050];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll ss[100005];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll modify(ll x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(x &lt; 0) x+=mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return x % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>freopen(&quot;fastsort_2.txt&quot;, &quot;r&quot;, stdin);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ios_base::sync_with_stdio(false);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin.tie(0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; q;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(n &gt; 100000) assert(false);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 1; i&lt;=n; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ss[i] = ss[i-1] + A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>B[i] = A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>discrete.push_back(A[i]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>sort(discrete.begin(), discrete.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 1; i&lt;=n; ++i) A[i] = lower_bound(discrete.begin(), discrete.end(), A[i]) - discrete.begin();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(ll i = 1; i&lt;=n; i++) printf(&quot;%d &quot;, A[i]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//<span style='mso-tab-count: 1'>���� </span>for(ll i = 1; i&lt;=n; i++) printf(&quot;%d &quot;, B[i]); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 1; i&lt;=n; ++i) copyA[i] = A[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 1; i&lt;=n; ++i) copyB[i] = B[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>wavelet *root = new wavelet(A+1, A+n+1, 0, n-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 1; i&lt;=n; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>dp[i][i] = (copyB[i] + mod) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(ll j = i+1; j&lt;=n; ++j){<span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ll add1 = (ss[j-1] - ss[i-1] - root-&gt;slte(i, j-1, copyA[j]) + mod) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dp[i][j] = dp[i][j-1] + add1 + (((copyB[j] + mod) % mod) * (root-&gt;lte(i, j-1, copyA[j]) + 1));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dp[i][j] += mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>dp[i][j] %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(q--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ll a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; (dp[a][b]) &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><i style='mso-bidi-font-style:normal'><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>From noiref: <o:p></o:p></span></u></i></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct SparseTable {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;vector&lt;int&gt; &gt; ST;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int N, K;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>SparseTable(int _N, int a[]): N(_N) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>K = MSB(N);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ST.resize(K);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>ST[0] = vector&lt;int&gt;(a, a+N);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (int k = 1; k &lt; K; ++k) <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>for (int i = 0; i+(1&lt;&lt;k) &lt;= N; ++i) <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��������������� </span>ST[k].push_back( min(ST[k-1][i], ST[k-1][i+(1&lt;&lt;(k-1))]) ); //min<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>/* returns most significant bit of an integer */<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>inline int MSB(unsigned int x) { return 32-__builtin_clz(x); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>/* Min of range (x, x + 2^k-1) and (y-2^k+1, y) */<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int query(int x, int y) { // <b style='mso-bidi-font-weight:normal'>[x, y]<o:p></o:p></b></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int k = MSB(y-x+1) - 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return min(ST[k][x], ST[k][y-(1&lt;&lt;k)+1]);<span style='mso-spacerun:yes'>����������� </span>//min<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>//usage: SparseTable *x = new SparseTable(n, A); x -&gt; functionToCall();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>2D Sparse Table &lt;O(NM log M log N), O(1)&gt;<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct SparseTable2D{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>vector&lt;vector&lt;vector&lt;vector&lt;int&gt;&gt;&gt;&gt; ST2; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// n, m, logn, logm<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int n, m, logn, logm;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>inline int MSB(unsigned int x) { return 32-__builtin_clz(x); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>inline int func(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return max(x,y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>SparseTable2D(int nn, int mm, vector&lt;vector&lt;int&gt;&gt; v){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>n = nn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m = mm;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ST2.resize(n);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>logn = MSB(n);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>logm = MSB(m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int i = 0; i&lt;n; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>ST2[i].resize(m);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>for(int j = 0; j&lt;m; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>ST2[i][j].resize(logn);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>ST2[i][j][0].push_back(v[i][j]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int logj = 1; logj&lt;logm; ++logj){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>for(int i = 0; i&lt;n; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>for(int j = 0; j+(1&lt;&lt;logj)&lt;=m; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 5'>����������������������������������� </span>ST2[i][j][0].push_back(func(ST2[i][j][0][logj-1], ST2[i][j+(1&lt;&lt;(logj-1))][0][logj-1]));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>for(int logi = 1; logi&lt;logn; ++logi){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>for(int logj = 0; logj&lt;logm; ++logj){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>for(int i = 0; i+(1&lt;&lt;logi)&lt;=n; ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 5'>����������������������������������� </span>for(int j = 0; j+(1&lt;&lt;logj)&lt;=m; ++j){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 6'>������������������������������������������ </span>int x = ST2[i][j][logi-1][logj];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 6'>������������������������������������������ </span>int y = ST2[i+(1&lt;&lt;(logi-1))][j][logi-1][logj];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 6'>������������������������������������������ </span>ST2[i][j][logi].push_back(func(x, y));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 5'>����������������������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 4'>���������������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>int query(int x1, int y1, int x2, int y2){ // [x1,y1] to [x2,y2] (inclusive)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x2++; y2++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int xd = x2-x1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int kxd = MSB(xd) - 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int yd = y2-y1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int kyd = MSB(yd) - 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int ans = 0; // change to INT_MAX for min<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = func(ans, ST2[x1][y1][kxd][kyd]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = func(ans, ST2[x2-(1&lt;&lt;kxd)][y1][kxd][kyd]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = func(ans, ST2[x1][y2-(1&lt;&lt;kyd)][kxd][kyd]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans = func(ans, ST2[x2-(1&lt;&lt;kxd)][y2-(1&lt;&lt;kyd)][kxd][kyd]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// usage: SparseTable2D *s = new SparseTable2D(n,m,A);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Minstack<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>stack&lt;int&gt; s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>stack&lt;int&gt; ss; //stores the minimum top stuff<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void push(int X) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>s.push(X); //add X to normal stack<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(ss.empty() or ss.top()&gt;=X) ss.push(X);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void pop() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(s.top() == ss.top()) ss.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>s.pop();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int top() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return s.top();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int getMin() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ss.top();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>PBDS</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/extc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace __gnu_pbds;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>template &lt;typename T&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using pbds_set = tree&lt;T, null_type, less&lt;T&gt;, rb_tree_tag, tree_order_statistics_node_update&gt;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>template &lt;typename K, typename V&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using pbds_map = tree&lt;K, V, less&lt;K&gt;, rb_tree_tag, tree_order_statistics_node_update&gt;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pbds_set&lt;int&gt; s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span></span><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'>s.insert(1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span>s.insert(20);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span>s.insert(7);<o:p></o:p></span></p> <p class=MsoNormal><span lang=DE style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:DE'><span style='mso-tab-count:1'>������ </span></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'>s.insert(9);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : s) printf(&quot;%d &quot;, i); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; *s.find_by_order(2) &lt;&lt; endl; // prints 9<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; s.order_of_key(11) &lt;&lt; endl; // prints 3<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pbds_map&lt;int, string&gt; m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>m[1] = &quot;Ryan&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>m[4] = &quot;Heeeen&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>m[3] = &quot;Moon&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(auto i : m) printf(&quot;%d %s\n&quot;, i.first, i.second.c_str()); printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>pbds_map&lt;int, string&gt;::iterator x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>x = m.find_by_order(1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; (*x).first &lt;&lt; &quot; &quot; &lt;&lt; (*x).second &lt;&lt; endl; // prints &quot;3 Moon&quot;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; m.order_of_key(2) &lt;&lt; endl; // prints 1<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Math<o:p></o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>GCD<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int gcd(int x, int y){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(y == 0) return x;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>return gcd(y, x%y);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Euclidean, Inverse (binomial)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define mod 1000000007<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll gcd(ll a, ll b, ll &amp;x, ll &amp;y){ // ax + by = gcd<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(a % b == 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x = 0, y = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll x1, y1; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// x1*b + y1*(a%b) = gcd<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a%b = a - a/b * b<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// a(y1) + b(x1-a/b*y1) = gcd<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = gcd(b, a%b, x1, y1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>x = y1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>y = x1 - y1*(a/b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll inv(ll a, ll m){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll x, y;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(gcd(a, m, x, y) != 1) return -1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return (x+m)%m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll n,k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; n &gt;&gt; k;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll ans = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(ll i = 0; i&lt;k; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans *= n-i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans *= inv(i+1, mod);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>LCM<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int lcm (int a, int b) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return (a/gcd(a, b))*b; //Divide before multiplying to prevent overflow<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Quick Exponentiation and Multiplication<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll qmult(ll a, ll b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(b == 0) return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll half = qmult(a, b/2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half += half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(b % 2 == 1) half += a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll qexp(ll b, ll e){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(e == 0) return 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll half = qexp(b, e/2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half = qmult(half, half); // or half*=half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half %= mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(e % 2 == 0) return half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else return (half*b) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Fibo_ex<o:p></o:p></span></u></p> <p class=p2><span lang=EN-US style='mso-ansi-language:EN-US'>If n is even then k = n/2:<o:p></o:p></span></p> <p class=p2><span lang=EN-US style='mso-ansi-language:EN-US'>F(n) = [2*F(k-1) + F(k)]*F(k)<o:p></o:p></span></p> <p class=p3><span lang=EN-US style='mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=p2><span lang=EN-US style='mso-ansi-language:EN-US'>If n is odd then k = (n + 1)/2<o:p></o:p></span></p> <p class=p2><span lang=EN-US style='mso-ansi-language:EN-US'>F(n) = F(k)*F(k) + F(k-1)*F(k-1)<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p><span style='text-decoration: none'>&nbsp;</span></o:p></span></u></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Matrix Exponentiation (fibo_ex)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US;mso-no-proof:yes'><!--[if gte vml 1]><v:shape id="Picture_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75" alt="../../../../../matmul" style='width:255pt;height:106pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="NOI%20Ref.fld/image002.png" o:title="matmul" grayscale="t"/> </v:shape><![endif]--><![if !vml]><img border=0 width=255 height=106 src="NOI%20Ref.fld/image003.png" alt="../../../../../matmul" v:shapes="Picture_x0020_1"><![endif]></span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>typedef long long ll;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int tc;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>struct matrix{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll m[2][2];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>matrix(){}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>matrix(ll a, ll b, ll c, ll d){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m[0][0] = a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m[0][1] = b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m[1][0] = c;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>m[1][1] = d;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>matrix clone(){ return matrix(m[0][0], m[0][1], m[1][0], m[1][1]); }<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>matrix operator* (matrix b){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>matrix a = (*this).clone(), o;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>o.m[0][0] = (a.m[0][0]*b.m[0][0] + a.m[0][1]*b.m[1][0]) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>o.m[1][0] = (a.m[0][1]*b.m[0][0] + a.m[1][1]*b.m[1][0]) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>o.m[0][1] = (a.m[0][0]*b.m[0][1] + a.m[0][1]*b.m[1][1]) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>o.m[1][1] = (a.m[1][0]*b.m[0][1] + a.m[1][1]*b.m[1][1]) % mod;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return o;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>matrix qfib(int n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(n == 1) return matrix(1,1,1,0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>matrix half = qfib(n/2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>half = half*half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(n%2 == 1) half = half*matrix(1,1,1,0);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return half;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cin &gt;&gt; tc;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(tc--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>int a,m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cin &gt;&gt; a &gt;&gt; m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>mod = m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; qfib(a).m[0][1] &lt;&lt; &quot;\n&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Sieve<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#define MAX 30000000<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bitset&lt;MAX+50&gt; isPrime;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; primes;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int n;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>scanf(&quot;%d&quot;, &amp;n);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>isPrime.reset(); isPrime.flip();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>isPrime[0] = isPrime[1] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 4; i&lt;=MAX; i+=2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>isPrime[i] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>primes.push_back(2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = 3; i&lt;=MAX; i+=2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(isPrime[i]) primes.push_back(i);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else continue;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int j = 2; j&lt;=MAX/i; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>isPrime[j*i] = false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// primes is a vector of primes<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// isPrime is a Boolean array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Prime Factorization<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int m;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; primes;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>map&lt;int, int&gt; primeFactors;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool isPrime[MAX];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void primeFactorise(ull n){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(auto i:primes){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(n == 1) return;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>primeFactors[i] = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while(n%i == 0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>n/=i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>primeFactors[i]++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>primeFactors[n]++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><i style='mso-bidi-font-style:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>From Noiref (untested):<o:p></o:p></span></i></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; primeList;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;int&gt; primeFactorize(int X) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; result;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (vector&lt;int&gt;::iterator it = primeList.begin(); it != primeList.end(); ++it) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (*it &gt; X/(*it)) break; //Check if prime exceeds sqrt(X)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>while (X % *it == 0) { //When it is divisible, divide as many times as possible<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>X /= *it; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>result.push_back(*it);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if (X != 1) result.push_back(X); //The last factor above sqrt(X)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return result;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Common Prime Factors (Noiref, untested)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int gcd (int a, int b) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; factorized_a = primeFactorize(a);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>vector&lt;int&gt; factorized_b = primeFactorize(b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int i = 0, j = 0, result = 1;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while (i &lt; factorized_a.size() &amp;&amp; j &lt; factorized_b.size()) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (factorized_a[i] &lt; factorized_b[j]) ++i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>else if (factorized_a[i] &gt; factorized_b[j]) ++j;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>else {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>result *= factorized_a[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>++i, ++j;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return result;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int to string<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string intToString(int x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>string ans = &quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(x){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>ans += (char) ((x%base) + '0');<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>x /= base;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>reverse(ans.begin(), ans.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>return ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string to int (problem: base)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>char n[100];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>unsigned long long nn;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>char ans[100];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main() {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>scanf(&quot;%s&quot;, &amp;n);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>scanf(&quot;%d %d&quot;, &amp;a, &amp;b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 0; i&lt;strlen(n); ++i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>nn*=a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(n[i] &gt;= 'A' &amp;&amp; n[i]&lt;='Z') nn+=n[i]-'A'+10;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>else nn+=n[i]-'0';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int i = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while(nn&gt;0){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>if(nn%b &lt; 10) ans[i] = nn%b+'0';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>else ans[i] = nn%b-10+'A';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>nn/=b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>i++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>reverse(ans, ans+strlen(ans));<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>printf(&quot;%s&quot;, ans);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Big integers (stored with strings) (problem: Looongnumbers)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>string a,b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>cin &gt;&gt; a &gt;&gt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>int carry = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(a.length() &lt; b.length()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int leadingzeros = b.length()-a.length();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>string addon;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while(leadingzeros--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>addon += &quot;0&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>a = addon+a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(b.length() &lt; a.length()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int leadingzeros = a.length()-b.length();<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>string addon;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>while(leadingzeros--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>addon += &quot;0&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>b = addon + b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>// cout &lt;&lt; a &lt;&lt; endl &lt;&lt; b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>string ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>for(int i = a.length()-1; i&gt;=0; i--){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int add = a[i]+b[i]-'0'-'0';<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>add += carry; carry = 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(add &gt;= 10){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����� </span>carry = 1; add-=10;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>ans = (char) (add+'0') + ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>if(carry != 0) ans = &quot;1&quot; + ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span>cout &lt;&lt; ans;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>isPrime</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool isPrime(long long int N) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(N==2 || N==3) return true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if(N%2 == 0||N%3==0) return false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for(int i = 5; i&lt;=N/i; i+=6){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if(N%i==0 || N%(i+2)==0) return false;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return true;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>From noiref:<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>bool isPrime(int x) {<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if (x &lt; 2) return false; //All primes are above 2<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else if (x == 2) return true; //If its 2, its a prime<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>else if (x % 2 == 0) return false; //If its even (other than 2), its not a prime -&gt; used for speedup <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (int i = 3; i &lt;= x/i; i+=2) { //Trial divide all odd numbers &gt; 2 up till the square root of x<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (x % i == 0) return false; //If a factor is found, x is not prime<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return true; //If no factors are found, x is a prime<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Bruteforce O(n!)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>sort(nodes.begin(), nodes.end()); // important!!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>do{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}while(next_permutation(nodes.begin(), nodes.end())); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Bruteforce O(2^N)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>for(int i = 1; i&lt;(1&lt;&lt;n); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int j = 0; j&lt;n; j++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if((1&lt;&lt;j) &amp; i){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>printf(&quot;1&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>printf(&quot;0&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>printf(&quot;\n&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Basic Mod properties<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>(A+B) % M = ((A % M) + (B % M)) % M<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>(A-B) % M = ((A % M) - (B % M) + M) % M<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>(A*B) % M = ((A % M) * (B % M)) % M<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Misc.<o:p></o:p></span></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Printing tables<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void printtable(int k){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>// print i, sa[i], suffix, ra[sa[i]], ra[sa[i]+k]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;i&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(6); cout&lt;&lt;left&lt;&lt;&quot;sa[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(20); cout&lt;&lt;left&lt;&lt;&quot;suffix[i]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(10); cout&lt;&lt;left&lt;&lt;&quot;ra[sa[i]]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout.width(10); cout&lt;&lt;left&lt;&lt;&quot;ra[sa[i]+k]&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;n; i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;&quot;&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(6); cout&lt;&lt;left&lt;&lt;sa[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(20); cout&lt;&lt;left&lt;&lt;suffix[i];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout.width(10); cout&lt;&lt;left&lt;&lt;ra[sa[i]+k];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>(Mo</span></u><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:"Tahoma",sans-serif; mso-ansi-language:EN-US'> s</span></u><u><span lang=EN-US style='font-size: 9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>) Sliding Thing<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>if(cl &lt; l){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cl &lt; l) remove(cl++);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cl &gt; l) add(--cl);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>if(cr &lt; r){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cr &lt; r) add(++cr);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}else{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(cr &gt; r) remove(cr--);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Median of Median DNC (untested from geeksforgeeks)</span></u><span lang=EN-US style='font-size:9.0pt; mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// C++ implementation of worst case linear time algorithm<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// to find k'th smallest element<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include&lt;iostream&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include&lt;algorithm&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include&lt;climits&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int partition(int arr[], int l, int r, int k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// A simple function to find median of arr[].<span style='mso-spacerun:yes'>� </span>This is called<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// only for an array of size 5 in this program.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int findMedian(int arr[], int n)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>sort(arr, arr+n);<span style='mso-spacerun:yes'>� </span>// Sort the array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return arr[n/2];<span style='mso-spacerun:yes'>�� </span>// Return middle element<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// Returns k'th smallest element in arr[l..r] in worst case<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// linear time. ASSUMPTION: ALL ELEMENTS IN ARR[] ARE DISTINCT<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int kthSmallest(int arr[], int l, int r, int k)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// If k is smaller than number of elements in array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>if (k &gt; 0 &amp;&amp; k &lt;= r - l + 1)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int n = r-l+1; // Number of elements in arr[l..r]<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// Divide arr[] in groups of size 5, calculate median<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// of every group and store it in median[] array.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int i, median[(n+4)/5]; // There will be floor((n+4)/5) groups;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>for (i=0; i&lt;n/5; i++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>median[i] = findMedian(arr+l+i*5, 5);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (i*5 &lt; n) //For last group with less than 5 elements<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>median[i] = findMedian(arr+l+i*5, n%5); <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>i++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<span style='mso-spacerun:yes'>��� </span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// Find median of all medians using recursive call.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// If median[] has only one element, then no need<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// of recursive call<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int medOfMed = (i == 1)? median[i-1]:<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�������������������������������� </span>kthSmallest(median, 0, i-1, i/2);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>� </span><span style='mso-spacerun:yes'>������</span>// Partition the array around a random element and<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// get position of pivot element in sorted array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>int pos = partition(arr, l, r, medOfMed);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// If position is same as k<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (pos-l == k-1)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>return arr[pos];<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (pos-l &gt; k-1)<span style='mso-spacerun:yes'>� </span>// If position is more, recur for left<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>return kthSmallest(arr, l, pos-1, k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>// Else recur for right subarray<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>return kthSmallest(arr, pos+1, r, k-pos+l-1);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// If k is more than number of elements in array<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return INT_MAX;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>void swap(int *a, int *b)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int temp = *a;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>*a = *b;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>*b = temp;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// It searches for x in arr[l..r], and partitions the array <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// around x.<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int partition(int arr[], int l, int r, int x)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// Search for x in arr[l..r] and move it to end<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (i=l; i&lt;r; i++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (arr[i] == x)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>���������� </span>break;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>swap(&amp;arr[i], &amp;arr[r]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>// Standard partition algorithm<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>i = l;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>for (int j = l; j &lt;= r - 1; j++)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>if (arr[j] &lt;= x)<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>swap(&amp;arr[i], &amp;arr[j]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>����������� </span>i++;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>swap(&amp;arr[i], &amp;arr[r]);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return i;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>// Driver program to test above methods<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main()<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>{<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int arr[] = {12, 3, 5, 7, 4, 19, 26};<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>int n = sizeof(arr)/sizeof(arr[0]), k = 3;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>cout &lt;&lt; &quot;K'th smallest element is &quot;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>�������� </span>&lt;&lt; kthSmallest(arr, 0, n-1, k);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-spacerun:yes'>��� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Ternary Search O(log N) (untested)<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while (abs(hi - lo) &gt; 1e-9) {<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>long double left = lo + (hi - lo) / 3;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>long double right = hi - (hi - lo) / 3;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>if (f(left) &lt; f(right)) lo = left;<o:p></o:p></span></p> <p class=MsoNormal style='text-indent:36.0pt'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>else hi = right;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><i style='mso-bidi-font-style:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'>Discrete (tested):<o:p></o:p></span></i></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>ll s=-1, e=1000000001;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>while(e-s&gt;2){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll high = e-(e-s)/3;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ll low = s+(e-s)/3;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(compute(low) &gt; compute(high)) s=low; // swap signs for frowning curve<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>else e=high;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>cout &lt;&lt; (s+e)/2 &lt;&lt; ' '; // average!<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Discretization</span></u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo; mso-ansi-language:EN-US'><o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>sort(discrete.begin(), discrete.end());<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>discrete.resize(unique(discrete.begin(), discrete.end())-discrete.begin());<o:p></o:p></span></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;font-family:Menlo;mso-ansi-language: EN-US'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>~/.vimrc<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set is<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set nu<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set autoindent<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>syntax on<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>colorscheme desert<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set background=dark<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>highlight Normal ctermfg=grey ctermbg=black<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set novb<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Minimalistic<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set nu<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set autoindent<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>syntax on<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>colorscheme desert<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>highlight Normal ctermfg=grey<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>set novb<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Useful vim<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Copy into Clipboard: �y<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>View reg: :reg<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Paste from reg 7: </span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt;mso-ascii-font-family: Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;mso-ansi-language: EN-US'>�</span><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size:12.0pt; font-family:Menlo;mso-ansi-language:EN-US'>p<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Substitute: :8,10 s/search/replace/g<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Substitute word: :%s/\&lt;word\&gt;/replace/g <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Split: vsplit, vertical resize +5, vertical resize 60<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Autoindent: gg=G<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Folding: <o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>:set foldmethod=manual<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>visual highlight the lines, :fold<o:p></o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Recording:<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vim *.cpp<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>qx<span style='mso-spacerun:yes'>����������� </span># start recording to register x<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>:%s/OldString/NewString/g<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>:wnext<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>q<span style='mso-spacerun:yes'>������������ </span># stop recording<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>@x<span style='mso-spacerun:yes'>����������� </span># playback to see if it works correctly<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>999@x<span style='mso-spacerun:yes'>�������� </span># repeat 999 times to complete the job<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Using gcc to compile<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>gcc 3td=c++11 poop.cpp; <o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>./a.out;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Using gdb to debug<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>gcc <b style='mso-bidi-font-weight: normal'>' </b>/ programName programName.cpp<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>sudo gdb programName<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>commands: start, control-x-a (tui), control-l (tui refresh), break<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>printf float<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>printf(&quot;%0.10lf\n&quot;,a/b);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><u><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>Grader<o:p></o:p></span></u></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>#include &lt;bits/stdc++.h&gt;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>using namespace std;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;string&gt; v;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>vector&lt;string&gt; v2;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>int main(){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>string s;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ifstream input; input.open(&quot;output.txt&quot;);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>ifstream input2; input2.open(&quot;answer.txt&quot;); // expected answer<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(getline(input, s)) if(s != &quot;&quot;) v.push_back(s);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>while(getline(input2, s)) if(s != &quot;&quot;) v2.push_back(s);<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>if(v.size() != v2.size()){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>cout &lt;&lt; &quot;Error: Different sizes&quot; &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>for(int i = 0; i&lt;v.size(); i++){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>if(v[i] != v2[i]){<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout &lt;&lt; &quot;Error: mismatch on line &quot; &lt;&lt; i &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>cout &lt;&lt; &quot;Expected &quot; &lt;&lt; v2[i] &lt;&lt; &quot; got &quot; &lt;&lt; v[i] &lt;&lt; endl;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 3'>��������������������� </span>return 0;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 2'>������������� </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><span style='mso-tab-count: 1'>������ </span>cout &lt;&lt; &quot;All Correct&quot;;<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'>}<o:p></o:p></span></p> <p class=MsoNormal><span lang=EN-US style='font-size:9.0pt;mso-bidi-font-size: 12.0pt;font-family:Menlo;mso-ansi-language:EN-US'><o:p>&nbsp;</o:p></span></p> </div> </body> </html>