Advertisement
Guest User

Untitled

a guest
Nov 7th, 2015
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. #include <vector>
  2. #include <cmath>
  3. #include <ctype.h>
  4. #include <cassert>
  5. #include <ctime>
  6. #include <climits>
  7. #include <limits>
  8. #include <algorithm>
  9. #include <list>
  10. #include <set>
  11. #include <map>
  12. #include <string>
  13. #include <stdio.h>
  14. #include <queue>
  15. #include <stack>
  16. #include <iomanip>
  17. #include <bitset>
  18. #include <utility>
  19. #include <deque>
  20. #include <stdlib.h>
  21. #include <functional>
  22. //#define C11
  23. //#include <windows.h>
  24.  
  25. #ifdef C11
  26. #include <unordered_map>
  27. #include <unordered_set>
  28. #include <tuple>
  29. #endif // C11
  30.  
  31. #define F first
  32. #define S second
  33. #define mp make_pair
  34. #define pb push_back
  35. #define fabs(x) ((x>0) ? (x) : -1*(x))
  36. #define show(a,n) cout <<#a<<": "; for (int iii=0;iii<n;iii++) cout <<a[iii]<<" "; cout<<"\n";
  37. #define show2(a,n,m) cout <<#a<<":\n"; for (int iii=0;iii<n;iii++) { for(int jjj=0;jjj<m;jjj++) cout <<a[iii][jjj]<<" "; cout <<"\n";}
  38. #define name(x) cout <<#x<<" \n";
  39. #define print(x) cout <<#x"="<<x<<"\n";
  40. #define letters char alp[30]={qwertyuiopasdfghjklzxcvbnm},sogl[30]={qwrtpsdfghjklzxcvbnm},gl[30]={eyuioa};
  41. #define SetBit(value,place) (value|(1<<place))
  42. #define ClearBit(value,place) (value&(~(1<<place)))
  43. #define InverseBit(value,place) (value^(1<<place))
  44. #define StartClock time_t inittime=clock();
  45. #define GetClock fprintf(stderr,"Time: %f\n",1.0*(clock()-inittime)/CLOCKS_PER_SEC);
  46.  
  47. typedef std::pair<int,int> pii;
  48. typedef std::vector <int>::iterator iti;
  49. typedef std::multiset <int>::iterator itm;
  50. typedef std::set <int>::iterator itset;
  51. typedef std::string::iterator its;
  52. typedef std::pair<long long,long long> pll;
  53. typedef std::vector <std::vector <int> > graph;
  54. typedef unsigned long long ull;
  55. typedef unsigned int ui;
  56.  
  57. using namespace std;
  58.  
  59. const int INF=INT_MAX;
  60. const long long LINF=LLONG_MAX;
  61. const unsigned long long ULINF=ULLONG_MAX;
  62. const double EPS=0.000001;
  63. const int mod=1000000007;
  64.  
  65. #define ONLINE_JUDGE
  66.  
  67. #ifndef ONLINE_JUDGE
  68. #include <fstream>
  69. ifstream cin("input.txt");
  70. ofstream cout("output.txt");
  71. #else
  72. #include <iostream>
  73. #endif // LOCAL
  74.  
  75. const int MAX_N=1000000;
  76.  
  77. vector <int> tree(MAX_N,0);
  78. int ver;
  79. struct node
  80. {
  81. int val, L , R , size;
  82.  
  83. node(int v, int l, int r, int S)
  84. {
  85. val = v;
  86. L = l;
  87. R = r;
  88. size = S;
  89. }
  90. node(){};
  91. };
  92.  
  93. vector <node> cont(MAX_N*40);
  94.  
  95. int build (int l, int r)
  96. {
  97. if (l > r)
  98. return 0;
  99. int ind = ++ver, m = (l + r)>>1;
  100. cont[ind] = node(m,build(l,m-1),build(m+1,r),0);
  101. return ind;
  102. }
  103.  
  104. int update(int x, int index, int ans)
  105. {
  106. if (x == 0)
  107. return 0;
  108. int ind = ++ver, l = cont[x].L, r = cont[x].R;
  109. if (index < cont[x].val)
  110. l = update(l, index, ans);
  111. if (index > cont[x].val)
  112. l = update(r, index, ans);
  113. cont[ind] = node(cont[x].val,l,r,cont[x].size + ans);
  114. return ind;
  115. }
  116.  
  117. int query(int x, int val)
  118. {
  119. if (val < cont[x].val)
  120. return query(cont[x].L,val) + cont[x].size - cont[cont[x].L].size;
  121. if (val > cont[x].val)
  122. return query(cont[x].R, val);
  123. return cont[x].size - cont[cont[x].L].size;
  124. }
  125.  
  126. map <int,int> exist;
  127.  
  128. int main()
  129. {
  130. ios_base::sync_with_stdio(0); //cin.tie(0);
  131. int n,q;
  132. cin >>n;
  133. tree[0]=build(1,n);
  134. for (int i=0;i<n;i++)
  135. {
  136. int x;
  137. cin >>x;
  138. if (exist[x] != 0)
  139. tree[i]=update(update(tree[i-1],exist[x],-1),i,+1);
  140. else
  141. tree[i]=update(tree[i-1],i,+1);
  142. exist[x]=i;
  143. }
  144. cin >>q;
  145. while (q--)
  146. {
  147. int l,r;
  148. cin >>l>>r;
  149. cout <<query(tree[r],l)<<"\n";
  150. }
  151. return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement