Getsum (b-1) <getsum (a) +k<=getsum (b) is required for the second largest number of K
B is the K-large number of a.
Also Gesum (b-1) <=getsum (b) can be used to find two points to do
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace Std;
const int maxn=100010;
int TREE[MAXN];
int lowbit (int i)
{
Return (i& (-i));
}
int getsum (int i)
{
int sum=0;
while (i>0)
{
Sum+=tree[i];
I-=lowbit (i);
}
return sum;
}
void update (int i,int dx)
{
while (I<MAXN)
{
TREE[I]+=DX;
I+=lowbit (i);
}
}
void Find (int left,int right,int num)
{
while (Left<=right)
{
int middle= (left+right)/2;
int middle = left + (right-left)/2;
int tmp=getsum (middle);
if (tmp<num)
left=middle+1;
Else
right=middle-1;
}
if (LEFT>=MAXN)
printf ("Not find!\n");
Else
printf ("%d\n", left);
}
int main ()
{
Freopen ("In.txt", "R", stdin);
Freopen ("OUT.txt", "w", stdout);
int m;
while (scanf ("%d", &m)!=eof)
{
int p,a,k;
memset (tree,0,sizeof (tree));
while (m--)
{
scanf ("%d", &p);
if (p==0)
{
scanf ("%d", &a);
Update (a,1);
}
else if (p==1)
{
scanf ("%d", &a);
if (! ( Getsum (a)-getsum (A-1))
{
printf ("No elment!\n");
Continue
}
Else
Update (A,-1);
}
Else
{
scanf ("%d%d", &a,&k);
int Tmp=getsum (a);
Find (A+1,MAXN-1,TMP+K);
}
}
}
}
hdu2852 KiKi ' s k-number tree-like array for K-large number