Guest User

Untitled

a guest
Jun 16th, 2012
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <set>
  5. #include <map>
  6. #include <string>
  7. #include <cmath>
  8. #include <cassert>
  9. #include <ctime>
  10. #include <algorithm>
  11. #include <queue>
  12. #include <memory.h>
  13. #include <stack>
  14. #define mp make_pair
  15. #define pb push_back                    
  16. #define setval(a,v) memset(a,v,sizeof(a))
  17.  
  18. #if ( _WIN32 || __WIN32__ )
  19.     #define LLD "%I64d"
  20. #else
  21.     #define LLD "%lld"
  22. #endif
  23.  
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27. typedef long double ld;
  28.  
  29. set<int> ans[50010];
  30.  
  31. set<int> small;
  32. set<int> big;
  33.  
  34. int res[210000];
  35.  
  36.  
  37. int main(){
  38.   #ifdef LOCAL
  39.     freopen("input.txt","r",stdin);
  40.     freopen("output.txt","w",stdout);
  41.   #endif
  42.     int n,m,k;
  43.     scanf("%d %d %d",&m,&n,&k);
  44.  
  45.     for (int i = 0; i < n; i++)
  46.         small.insert(i);
  47.  
  48.     int id = 0;
  49.  
  50.     for (int i = 0; i < m; i++){
  51.         char c;
  52.         scanf(" %c",&c);
  53.         if (c == '-'){
  54.             int id;
  55.             scanf("%d",&id);
  56.             int from = res[id];
  57.             if (big.empty()){
  58.                 small.swap(big);
  59.             }
  60.             if (big.find(from) != big.end()){
  61.                 ans[from].erase(id);
  62.                 big.erase(from);
  63.                 small.insert(from);
  64.                 continue;
  65.             }
  66.             ans[from].erase(id);
  67.             set<int>::iterator iter = big.lower_bound(from);
  68.             int temp;
  69.             if (iter == big.begin()){
  70.                 temp = *iter;
  71.             } else if (iter == big.end()){
  72.                 temp = *(--iter);
  73.             }
  74.             else {
  75.                 set<int>::iterator iter2 = iter;
  76.                 iter2--;
  77.                 if (abs(*iter-from) < abs(*iter2-from))
  78.                     temp = *iter;
  79.                 else
  80.                     temp = *iter2;
  81.             }
  82.             big.erase(temp);
  83.             small.insert(temp);
  84.  
  85.             id = *ans[temp].begin();
  86.             ans[temp].erase(id);
  87.             ans[from].insert(id);
  88.             res[id] = from;            
  89.         }
  90.         else {
  91.            ++id;
  92.            if (small.empty()){
  93.               small.swap(big);
  94.            }
  95.            int to = *small.begin();
  96.            ans[to].insert(id);
  97.            small.erase(to);
  98.            big.insert(to);
  99.            res[id] = to;
  100.         }
  101.     }
  102.  
  103.     for (int i = 0; i < n; i++,printf("\n")){
  104.         printf("%d",ans[i].size());
  105.         for (set<int>::iterator iter = ans[i].begin(); iter != ans[i].end(); ++iter)
  106.             printf(" %d",*iter);
  107.     }
  108.  
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment