fork(2) download
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. #include <cstdlib>
  5. #include <map>
  6. using namespace std;
  7.  
  8. // S ID POS IDDR - split treap id at pos in id and iddr
  9. // J IDST IDDR - join idst and iddr in idst
  10. // Q ID PST PDR - find minimum of id's values form pst to pdr
  11.  
  12. ifstream F("trains.in");
  13. ofstream G("trains.out");
  14.  
  15. const int infi = (1LL<<31)-1;
  16. const int debuging = 0;
  17. const int N = 16010;
  18.  
  19. struct treap
  20. {
  21. int value,min,priority,size;
  22. treap *left,*right;
  23. treap() {}
  24. treap(int priority,int value,int min,int size,treap *left,treap *right)
  25. {
  26. this->priority = priority;
  27. this->value = value;
  28. this->min = min;
  29. this->left = left;
  30. this->right = right;
  31. this->size = size;
  32. }
  33. };
  34.  
  35. treap* _null;
  36. map<int,treap*> mp; // id->treap
  37.  
  38. treap *tree;
  39. int n,m;
  40.  
  41. void init()
  42. {
  43. srand(time(0));
  44. _null = new treap(0,infi,infi,0,NULL,NULL);
  45. }
  46.  
  47. void update(treap *n)
  48. {
  49. n->size = n->left->size + n->right->size + 1;
  50. n->min = min( n->left->min , n->right->min );
  51. n->min = min( n->min,n->value );
  52. }
  53.  
  54. void rleft(treap* &z) // l->r
  55. {
  56. treap* w = z->left;
  57. z->left = w->right;
  58. w->right = z;
  59. z = w;
  60.  
  61. update(z->right);
  62. update(z);
  63. }
  64.  
  65. void rright(treap* &w) // r->l
  66. {
  67. treap* z = w->right;
  68. w->right = z->left;
  69. z->left = w;
  70. w = z;
  71.  
  72. update(w->left);
  73. update(w);
  74. }
  75.  
  76. void balance(treap* &n)
  77. {
  78. if ( n->left->priority > n->priority )
  79. rleft(n);
  80. else
  81. if ( n->right->priority > n->priority )
  82. rright(n);
  83. }
  84.  
  85. void insert(treap* &n,int pos,int priority,int value)
  86. {
  87. if ( n == _null )
  88. {
  89. n = new treap(priority,value,value,1,_null,_null);
  90. return;
  91. }
  92. if ( pos <= n->left->size+1 )
  93. insert(n->left,pos,priority,value);
  94. else
  95. insert(n->right,pos-(n->left->size+1),priority,value);
  96. balance(n);
  97. update(n);
  98. }
  99.  
  100. treap *aux;
  101.  
  102. void erase(treap *&t,int pos)
  103. {
  104. if ( pos == t->left->size+1 )
  105. {
  106. if ( t->left == _null && t->right == _null )
  107. {
  108. aux = new treap(t->priority,t->value,infi,0,NULL,NULL);
  109. delete t;
  110. t = _null;
  111. return;
  112. }
  113. else if ( t->left->priority > t->right->priority )
  114. {
  115. rleft(t);
  116. erase(t->right,pos-(t->left->size)-1);
  117. }
  118. else
  119. {
  120. rright(t);
  121. erase(t->left,pos);
  122. }
  123. } else
  124. if ( t->left->size >= pos )
  125. erase(t->left,pos);
  126. else
  127. erase(t->right,pos-(t->left->size)-1);
  128.  
  129. update(t);
  130. }
  131.  
  132. void split(treap* &n,int pos,treap* &m)
  133. {
  134. erase(n,pos);
  135. int pr = aux->priority , vl = aux->value;
  136. insert(n,pos,infi,aux->value);
  137. m = n->right;
  138. n->right = _null;
  139. erase(n,pos);
  140. insert(n,pos,pr,vl);
  141. aux = _null;
  142. }
  143.  
  144. void join(treap *&n,treap *l,treap *r)
  145. {
  146. n = new treap(-infi,infi,infi,l->size+r->size,l,r);
  147. erase(n,n->left->size+1);
  148. }
  149.  
  150. int go(treap* &n,int pos,int l,int r)
  151. {
  152. int a = (n->left->size+1);
  153. int v = infi;
  154.  
  155. if ( pos < a )
  156. v = go(n->left,pos,l,r);
  157. else if ( pos > a )
  158. v = go(n->right,pos-a,l-a,r-a);
  159.  
  160. if ( l <= a && a <= r ) v = min(v,n->value);
  161.  
  162. if ( n->left != _null )
  163. {
  164. int start = 1;
  165. int stop = n->left->size;
  166. if ( l <= start && stop <= r )
  167. v = min(v,n->left->min);
  168. }
  169. if ( n->right != _null )
  170. {
  171. int start = n->left->size+2;
  172. int stop = n->size;
  173. if ( l <= start && stop <= r )
  174. v = min(v,n->right->min);
  175. }
  176.  
  177. return v;
  178. }
  179.  
  180. int query(treap* &n,int l,int r)
  181. {
  182. int mini = infi;
  183. mini = min( mini , go(n,l,l,r) );
  184. mini = min( mini , go(n,r,l,r) );
  185. return mini;
  186. }
  187.  
  188. void print(treap *n)
  189. {
  190. if ( n == _null ) return;
  191. print(n->left);
  192. cerr<<n->value<<' ';
  193. //cerr<<n->priority<<' ';
  194. print(n->right);
  195. }
  196.  
  197. int main()
  198. {
  199. init();
  200. tree = _null;
  201. F>>n>>m;
  202. for (int i=1,a;i<=n;++i)
  203. {
  204. F>>a;
  205. insert(tree,i,rand()+1,a);
  206. if ( debuging ) print(tree),cerr<<'\n';
  207. }
  208. mp[0] = tree;
  209. for (int i=1;i<=m;++i)
  210. {
  211. char ch;
  212. F>>ch;
  213. if ( ch == 'S' )
  214. {
  215. int a,p,b;
  216. F>>a>>p>>b;
  217. treap* aux_tree = _null;
  218. split(mp[a],p,aux_tree);
  219. mp[b] = aux_tree;
  220. if ( debuging )
  221. {
  222. cerr<<"split"<<'\n';
  223. print(mp[a]); cerr<<'\n';
  224. print(mp[b]); cerr<<'\n';
  225. }
  226. }
  227. if ( ch == 'J' )
  228. {
  229. int a,b;
  230. F>>a>>b;
  231. join(mp[a],mp[a],mp[b]);
  232. mp[b] = _null;
  233. if ( debuging )
  234. {
  235. cerr<<"join"<<'\n';
  236. print(mp[a]); cerr<<'\n';
  237. }
  238. }
  239. if ( ch == 'Q' )
  240. {
  241. int a,l,r;
  242. F>>a>>l>>r;
  243. G<<query(mp[a],l,r)<<' ';
  244. }
  245. }
  246. }
  247.  
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Standard output is empty