树状数组 求第k大

树状数组 求第k大
#include  < iostream >
#include
< cstdio >
#include
< cstring >
using   namespace  std;

const   int  MAX_VAL  =   300000 // 输入的数字范围 

int  c[MAX_VAL + 5 ];
int  delta;

inline 
int  lowbit( int  x){ return  x & ( - x);}

 
void  add( int  p, int  x)
{
    
while (p <= MAX_VAL)
    {
        c[p]
+= x;
        p
+= lowbit(p);
    }
}

int  find_kth( int  K)
{
    
int  ans  =   0 ,cnt  =   0 ;
    
for ( int  i = 19 ;i >= 0 ;i -- ) // 这里的19适当的取值,与MAX_VAL有关,一般取lg(MAX_VAL) 
    {
        ans
+= ( 1 << i);
        
if (ans >=  MAX_VAL || cnt + c[ans] >=  K)ans -= ( 1 << i);
        
else  cnt += c[ans];
    }
    
return  ans + 1 ;
}
int  main()
{
    
int  n;
    
int  x, k, i;
    
while  (cin  >>  n)
    {
        memset(c, 
0 sizeof (c));
        
for  (i  =   0 ; i  <  n; i ++ )
        {
            scanf(
" %d " & x);
            add(x, 
1 );
        }
        cin 
>>  n;
        
for  (i  =   0 ; i  <  n; i ++ )
        {
            cin 
>>  k;
            cout 
<<  find_kth(k)  <<  endl;
        }
    } 
    
return   0 ;
}

你可能感兴趣的:(树状数组 求第k大)