HDU 2852 KiKi's K-Number(离线+树状数组)

时间:2023-03-09 02:58:04
HDU 2852 KiKi's K-Number(离线+树状数组)

题目链接

省赛训练赛上一题,貌似不难啊。当初,没做出。离线+树状数组+二分。

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define N 100000
int p[];
int qur[][];
int lowbit(int t)
{
return t&(-t);
}
void insert(int t,int d)
{
while(t <= N)
{
p[t] += d;
t += lowbit(t);
}
}
int getsum(int t)
{
int sum = ;
while(t)
{
sum += p[t];
t -= lowbit(t);
}
return sum;
}
int bin(int x)
{
int str,end,mid;
if(x > getsum(N))
return -;
str = ;
end = N;
while(str < end)
{
mid = (str + end)/;
if(getsum(mid) < x)
str = mid + ;
else
end = mid;
}
return str;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
memset(p,,sizeof(p));
for(i = ;i < n;i ++)
{
scanf("%d",&qur[i][]);
if(qur[i][] == ||qur[i][] == )
scanf("%d",&qur[i][]);
else
scanf("%d%d",&qur[i][],&qur[i][]);
}
for(i = ;i < n;i ++)
{
if(qur[i][] == )
insert(qur[i][],);
else if(qur[i][] == )
{
if(getsum(qur[i][])-getsum(qur[i][]-) > )
insert(qur[i][],-);
else
printf("No Elment!\n");
}
else
{
int flag;
flag = bin(getsum(qur[i][])+qur[i][]);
if(flag == -)
printf("Not Find!\n");
else
printf("%d\n",flag);
}
}
}
return ;
}