Advertisement
Guest User

Untitled

a guest
Nov 7th, 2015
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 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 MAXN = 1000000;
  76. int tree[MAXN];
  77. int tr_cnt;
  78. struct node {
  79.     int val, l, r, size;
  80.  
  81.     node (int v ,int L ,int R , int s )
  82.     {
  83.         val = v;
  84.         l = L;
  85.         r = R;
  86.         size = s;
  87.     }
  88.     node(){};
  89. };
  90.  
  91. node* ver = new node[40 * MAXN];
  92.  
  93. int build( int l, int r)
  94. {
  95.     if ( l > r)
  96.         return 0;
  97.     int ind = ++tr_cnt;
  98.     int m = ( l + r)>>1;
  99.     ver[ind] = node(m, build(l, m - 1 ), build( m + 1, r), 0 );
  100.     return ind;
  101. }
  102.  
  103. int update( int x, int value, int amount )
  104. {
  105.     if ( x == 0 )
  106.         return 0;
  107.     int idx = ++tr_cnt;
  108.     int L = ver[x].l;
  109.     int R = ver[x].r;
  110.     if ( value < ver[x].val )
  111.         L = update( L, value, amount );
  112.     if ( value > ver[x].val )
  113.         R = update( R, value, amount );
  114.     ver[idx] = node(ver[x].val, L, R, ver[x].size + amount );
  115.     return idx;
  116. }
  117.  
  118. int query( int x, int value)
  119. {
  120.     if ( value < ver[x].val )
  121.         return query( ver[x].l, value) + ver[x].size -  ver[ ver[x].l].size;
  122.     if ( value > ver[x].val )
  123.         return query( ver[x].r, value);
  124.     return ver[x].size - ver[ ver[x].l].size;
  125. }
  126.  
  127. int main()
  128. {
  129.     int n,q;
  130.     scanf( "%d", &n );
  131.     map< int, int > exist;
  132.     tree[0] = build( 1, n );
  133.     for ( int i = 1; i <= n; i++ )
  134.     {
  135.         int x;
  136.         scanf( "%d", &x );
  137.         if ( exist[x] != 0 )
  138.             tree[i] = update( update( tree[i - 1], exist[x], -1 ), i, +1 );
  139.         else
  140.             tree[i] = update( tree[i - 1], i, +1 );
  141.         exist[x] = i;
  142.     }
  143.  
  144.     scanf( "%d", &q );
  145.     while ( q-- ) {
  146.         int l, r;
  147.         scanf( "%d %d", &l, &r);
  148.         printf( "%d\n", query( tree[r], l) );
  149.     }
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement