NonWhite

SPOJ 3267

Jul 20th, 2013
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <bitset>
  4. #include <cstdio>
  5. #include <string>
  6. #include <cstring>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <set>
  11. #include <map>
  12. #include <algorithm>
  13. #include <cmath>
  14. #include <cstdlib>
  15. #include <cctype>
  16. #include <numeric>
  17. #include <list>
  18. #define FOR(i,A) for(typeof (A).begin() i = (A).begin() ; i != (A).end() ; i++)
  19. #define mp make_pair
  20. #define debug( x ) cout << #x << " = " << x << endl
  21. #define clr(v,x) memset( v, x , sizeof v )
  22. #define all(x) (x).begin() , (x).end()
  23. #define rall(x) (x).rbegin() , (x).rend()
  24. #define ones(x) __builtin_popcount( x )
  25. #define f(i,a,b) for(int i = a ; i < b ; i++)
  26. #define fd(i,a,b) for(int i = a ; i >= b ; i--)
  27. #define PI acos( -1.0 )
  28. #define EPS 1E-9
  29. #define TAM 200010
  30.  
  31. using namespace std;
  32.  
  33. typedef pair<int,int> ii ;
  34. typedef long long ll ;
  35. typedef long double ld ;
  36. typedef pair<int,ii> pii ;
  37.  
  38. int r[ 200010 ] ;
  39. ii in[ TAM ] ;
  40. int num[ 1000010 ] ;
  41. vector<int> g[ 1000010 ] ;
  42. int v[ 30010 ] ;
  43. int bit[ 30010 ] ;
  44. int n , q ;
  45.  
  46. void update( int x , int val ){
  47.     for( ; x <= n ; x += x & -x ) bit[ x ] += val ;
  48. }
  49.  
  50. int sum( int x ){
  51.     int R = 0 ;
  52.     for( ; x > 0 ; x -= x & -x ) R += bit[ x ] ;
  53.     return R ;
  54. }
  55.  
  56. int main(){
  57.  
  58.     scanf("%d" , &n ) ;
  59.     f( i , 0 , n ) scanf("%d" , &v[ i ] ) ;
  60.     scanf("%d" , &q ) ;
  61.     f( i , 0 , q ){
  62.         scanf("%d%d" , &in[ i ].first , &in[ i ].second ) ;
  63.         g[ in[ i ].second - 1 ].push_back( i ) ;
  64.     }
  65.  
  66.     clr( num , -1 ) ;
  67.     f( i , 0 , n ){
  68.         if( num[ v[ i ] ] < 0 ){
  69.             update( i+1 , 1 ) ;
  70.             num[ v[ i ] ] = i ;
  71.         }else{
  72.             update( num[ v[ i ] ]+1 , -1 ) ;
  73.             num[ v[ i ] ] = i ;
  74.             update( i+1 , 1 ) ;
  75.         }
  76.         f( j , 0 , g[ i ].size() ){
  77.             ii input = in[ g[ i ][ j ] ] ;
  78.             int val = sum( input.second ) - sum( input.first - 1 ) ;
  79.             r[ g[ i ][ j ] ] = val ;
  80.         }
  81.     }
  82.     f( i , 0 , q ) printf("%d\n" , r[ i ] ) ;
  83.  
  84.     return 0 ;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment