Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <cctype>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10.  
  11. const int MAXN = 100005;
  12.  
  13. int query[ MAXN ];
  14. int L[ MAXN ];
  15. int R[ MAXN ];
  16. int block[ MAXN ];
  17.  
  18. inline bool cmp( const int &a, const int &b )
  19. {
  20.     return block[a] < block[b] || block[a] == block[b] && L[a] < L[b]; 
  21. }
  22.  
  23. int N, Q;
  24. int sqrtN;
  25. int A[ MAXN ];
  26.  
  27. int freq[ 2 ][ MAXN ];
  28. // freq[1][x] -> frekvencija x-tog elementa // frequency of element x
  29. // freq[2][y] -> broj elemenata s fekvencijom y // number of elements with frequency == y
  30. int sol[ MAXN ];
  31. int ans;
  32.  
  33. // dodaj broj
  34. // add number to freq table
  35. inline void inc( int x )
  36. {
  37.     if ( freq[0][x] ) freq[1][ freq[0][x] ]--;
  38.     freq[0][x]++;
  39.     freq[1][ freq[0][x] ]++;
  40.     ans = max( ans, freq[0][x] );
  41. }
  42.  
  43. // makni broj
  44. // del number from freq table
  45. inline void dec( int x )
  46. {
  47.     freq[1][ freq[0][x] ]--;
  48.     freq[0][x]--;
  49.     if ( freq[0][x] > 0 ) freq[1][ freq[0][x] ]++;
  50.     while ( ans && !freq[1][ans] ) --ans;
  51. }
  52.  
  53. inline void move( int nx, int ny, int &x, int &y )
  54. {
  55.     for ( ; x > nx; ) inc( A[--x] );
  56.     for ( ; x < nx; ++x ) dec( A[x] );
  57.     for ( ; y > ny; --y ) dec( A[y] );
  58.     for ( ; y < ny; ) inc( A[++y] );
  59. }
  60.  
  61. int main()
  62. {
  63.     scanf( "%d%d", &N, &Q );
  64.     //N = IO :: read_int(); Q = IO :: read_int();
  65.     sqrtN = (int) sqrt( N );
  66.     for ( int i = 0; i < N; ++i ) scanf( "%d", A+i );//A[i] = IO :: read_int();
  67.     for ( int i = 0; i < Q; ++i ) {
  68.         scanf( "%d%d", L+i, R+i );//L[i] = IO::read_int(), R[i] = IO::read_int();
  69.         block[i] = (R[i]-L[i]) / sqrtN; //l / sqrtN;
  70.         query[i] = i;
  71.     }
  72.    
  73.     sort( query, query + Q, cmp );
  74.    
  75.     ans = 0;
  76.     int lo = L[query[0]];
  77.     int hi = R[query[0]];
  78.     for ( int i = lo; i <= hi; ++i ) inc( A[i] );
  79.     sol[ query[0] ] = ans;
  80.    
  81.     for ( int i = 1; i < Q; ++i ) {
  82.         move( L[query[i]], R[query[i]], lo, hi );
  83.         sol[ query[i] ] = ans;
  84.     }
  85.    
  86.     for ( int i = 0; i < Q; ++i )
  87.         printf( "%d\n", sol[i] );
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement