<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=E-olymp_2310</id>
	<title>E-olymp 2310 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=E-olymp_2310"/>
	<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=E-olymp_2310&amp;action=history"/>
	<updated>2026-05-13T12:10:34Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://acm.khpnets.info/w39/index.php?title=E-olymp_2310&amp;diff=2005&amp;oldid=prev</id>
		<title>Ctrlalt: Новая страница: «== Ссылка на задачу == * [http://www.e-olymp.com/ru/problems/2310 E-olymp #2310 &amp;mdash; И снова сумма...]  == Решение ==  #include…»</title>
		<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=E-olymp_2310&amp;diff=2005&amp;oldid=prev"/>
		<updated>2016-04-24T21:41:03Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== Ссылка на задачу == * [http://www.e-olymp.com/ru/problems/2310 E-olymp #2310 — И снова сумма...]  == Решение ==  #include…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Ссылка на задачу ==&lt;br /&gt;
* [http://www.e-olymp.com/ru/problems/2310 E-olymp #2310 &amp;amp;mdash; И снова сумма...]&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 class Treap {&lt;br /&gt;
 &lt;br /&gt;
     struct TreapNode {&lt;br /&gt;
         int key, priority;&lt;br /&gt;
         long long keysSum;&lt;br /&gt;
         TreapNode *left, *right;&lt;br /&gt;
         TreapNode(int key) : key(key), keysSum(key), priority(rand()), left(0), right(0) {}&lt;br /&gt;
     } *root;&lt;br /&gt;
 &lt;br /&gt;
     long long getKeysSum(TreapNode *node) {&lt;br /&gt;
         return node ? node-&amp;gt;keysSum : 0;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void update(TreapNode *node) {&lt;br /&gt;
         if (!node)&lt;br /&gt;
             return;&lt;br /&gt;
         node-&amp;gt;keysSum = node-&amp;gt;key + getKeysSum(node-&amp;gt;left) + getKeysSum(node-&amp;gt;right);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     TreapNode *merge(TreapNode *a, TreapNode *b) {&lt;br /&gt;
         if (!a || !b)&lt;br /&gt;
             return a ? a : b;&lt;br /&gt;
         if (a-&amp;gt;priority &amp;gt; b-&amp;gt;priority) {&lt;br /&gt;
             a-&amp;gt;right = merge(a-&amp;gt;right, b);&lt;br /&gt;
             update(a);&lt;br /&gt;
             return a;&lt;br /&gt;
         } else {&lt;br /&gt;
             b-&amp;gt;left = merge(a, b-&amp;gt;left);&lt;br /&gt;
             update(b);&lt;br /&gt;
             return b;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     void split(TreapNode *t, int splitKey, TreapNode *&amp;amp;a, TreapNode *&amp;amp;b) {&lt;br /&gt;
         if (!t) {&lt;br /&gt;
             a = b = 0;&lt;br /&gt;
             return;&lt;br /&gt;
         }&lt;br /&gt;
         if (t-&amp;gt;key &amp;lt; splitKey) {&lt;br /&gt;
             split(t-&amp;gt;right, splitKey, t-&amp;gt;right, b);&lt;br /&gt;
             a = t;&lt;br /&gt;
         } else {&lt;br /&gt;
             split(t-&amp;gt;left, splitKey, a, t-&amp;gt;left);&lt;br /&gt;
             b = t;&lt;br /&gt;
         }&lt;br /&gt;
         update(a);&lt;br /&gt;
         update(b);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 public:&lt;br /&gt;
 &lt;br /&gt;
     Treap() : root(0) {}&lt;br /&gt;
 &lt;br /&gt;
     void insertUnique(int key) {&lt;br /&gt;
         TreapNode *tLess, *tEqual, *tGreater;&lt;br /&gt;
         split(root, key, tLess, tGreater);&lt;br /&gt;
         split(tGreater, key + 1, tEqual, tGreater);&lt;br /&gt;
         if (!tEqual)&lt;br /&gt;
             tEqual = new TreapNode(key);&lt;br /&gt;
         root = merge(tLess, merge(tEqual, tGreater));&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     long long keysSum(int keyL, int keyR) {&lt;br /&gt;
         TreapNode *tLess, *tIn, *tGreater;&lt;br /&gt;
         split(root, keyL, tLess, tGreater);&lt;br /&gt;
         split(tGreater, keyR + 1, tIn, tGreater);&lt;br /&gt;
         long long result = getKeysSum(tIn);&lt;br /&gt;
         root = merge(tLess, merge(tIn, tGreater));&lt;br /&gt;
         return result;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 } treap;&lt;br /&gt;
 &lt;br /&gt;
 int main() {&lt;br /&gt;
     freopen(&amp;quot;input.txt&amp;quot;, &amp;quot;r&amp;quot;, stdin);&lt;br /&gt;
     freopen(&amp;quot;output.txt&amp;quot;, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
 &lt;br /&gt;
     int queriesCount;&lt;br /&gt;
     scanf(&amp;quot;%d&amp;quot;, &amp;amp;queriesCount);&lt;br /&gt;
     long long previousResult = 0;&lt;br /&gt;
     for (int i = 0; i &amp;lt; queriesCount; i++) {&lt;br /&gt;
         char queryType;&lt;br /&gt;
         scanf(&amp;quot; %c&amp;quot;, &amp;amp;queryType);&lt;br /&gt;
         if (queryType == &amp;#039;+&amp;#039;) {&lt;br /&gt;
             int key;&lt;br /&gt;
             scanf(&amp;quot;%d&amp;quot;, &amp;amp;key);&lt;br /&gt;
             treap.insertUnique((key + previousResult) % (int)1e9);&lt;br /&gt;
             previousResult = 0;&lt;br /&gt;
         } else {&lt;br /&gt;
             int keyL, keyR;&lt;br /&gt;
             scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;keyL, &amp;amp;keyR);&lt;br /&gt;
             previousResult = treap.keysSum(keyL, keyR);&lt;br /&gt;
             printf(&amp;quot;%lld\n&amp;quot;, previousResult);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Сборник задач: E-olymp]]&lt;br /&gt;
[[Category: Задачи: Декартово дерево]]&lt;/div&gt;</summary>
		<author><name>Ctrlalt</name></author>
	</entry>
</feed>