Advertisement
AmrMahmoud

Untitled

Sep 27th, 2014
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <string>
  6. #include <cctype>
  7. #include <stack>
  8. #include <queue>
  9. #include <list>
  10. #include <vector>
  11. #include <map>
  12. #include <sstream>
  13. #include <cmath>
  14. #include <limits>
  15. #include <bitset>
  16. #include <utility>
  17. #include <set>
  18. #include <numeric>
  19.  
  20. #define INF_MAX 2147483647
  21. #define INF_MIN -2147483647
  22. #define INF_LL 9223372036854775807LL
  23. #define INF 1000000000
  24. #define PI acos(-1.0)
  25. #define EPS 1e-9
  26. #define LL long long
  27. #define mod 1000000007
  28. #define pb push_back
  29. #define mp make_pair
  30. #define setzero(a) memset(a,0,sizeof(a))
  31. #define setdp(a) memset(a,-1,sizeof(a))
  32.  
  33. using namespace std;
  34.  
  35. int arr[100005],arr2[100005],R[100005],L[100005],n;
  36. int tree[100005],MaxVal = 100005;
  37.  
  38. void update(LL idx, int val)
  39. {
  40.     while(idx <= MaxVal && idx > 0){
  41.         tree[idx] = tree[idx] + val;
  42.         idx = idx + (idx & -idx);
  43.     }
  44. }
  45.  
  46. int read(LL idx)
  47. {
  48.     int sum = 0;
  49.     while (idx > 0 && idx <= MaxVal){
  50.         sum = sum + tree[idx];
  51.         idx = idx - (idx & -idx);
  52.     }
  53.     return sum;
  54. }
  55.  
  56. int main()
  57. {
  58.     //freopen("straight.in","r",stdin);
  59.     //freopen("straight.out","w",stdout);
  60.     int x,first;
  61.     scanf("%d",&n);
  62.     for(int i=1;i<=n;i++)
  63.     {
  64.         scanf("%d",&x);
  65.         if(i == 1) first = x;
  66.         arr[x] = i;
  67.         arr2[i] = x;
  68.         update(i, 1);
  69.     }
  70.     for(int i=1;i<=n;i++)
  71.         R[arr2[i]] = arr2[i+1],L[arr2[i]] = arr2[i-1];
  72.     for(int i=1;i<=n-2;i++)
  73.     {
  74.         scanf("%d",&x);
  75.         if(R[x] != 0)
  76.             L[R[x]] = L[x];
  77.         if(L[x] != 0)
  78.             R[L[x]] = R[x];
  79.         if(x == first)
  80.             first = R[x];
  81.         int temp = read(arr[x]);
  82.         update(1, 1);
  83.         update(arr[x], -1);
  84.         if((temp - i) % 2 == 1)
  85.         {
  86.             swap(arr[first], arr[R[first]]);
  87.             int test = R[first];
  88.             L[R[test]] = first;
  89.             L[test] = 0;
  90.             R[first] = R[test];
  91.             R[test] = first;
  92.             L[first] = test;
  93.             first = test;
  94.         }
  95.     }
  96.     scanf("%d",&x);
  97.     if(x == first)
  98.         cout << "Possible";
  99.     else cout << "Impossible";
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement