P3369 【模板】普通平衡树 树状数组

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include<iostream>
#include<cstdio>
using namespace std;
const int Maxn=10000000;
int tr[2*Maxn+10];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x)
{
    x+=Maxn;x++;
    while (x<=Maxn*2+9)
    {
        tr[x]++;
        x=x+lowbit(x);
    }
}
void dele(int x)
{
    x+=Maxn;x++;
    while(x<=Maxn*2+9)
    {
        tr[x]--;
        x=x+lowbit(x);
    }
}
int getsum(int x)
{
    x+=Maxn;x++;
    int ans=0;
    while(x)
    {
        ans+=tr[x];
        x=x-lowbit(x);
    }
    return ans;
}
//x的排名
int getk(int x)
{
    return getsum(x);
}
//排名为x的是谁?
int rank(int x)
{
    int left=-1e7,right=1e7;
    while(left!=right){
        int mid=(left+right)>>1;
        int m=getsum(mid);
        if(m>=x)right=mid;
        else left=mid+1;
    }
    return left;
}
int pre(int x)
{
    return rank(getk(x-1));
}
int suc(int x)
{
    return rank(getk(x)+1);
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int opt,x;
        scanf("%d%d",&opt,&x);
        switch(opt)
        {
            case 1:
                {
                    add(x);
                    break;
                }
            case 2:
                {
                    dele(x);
                    break;
                }
            case 3:
                {
                    printf("%d\n",getk(x-1)+1);
                    break;
                }
            case 4:
                {
                    printf("%d\n",rank(x));
                    break;
                }
            case 5:
                {
                    printf("%d\n",pre(x));
                    break;
                }
            case 6:
                {
                    printf("%d\n",suc(x));
                    break;
                     
                }
             
        }
    }
}

  

posted @   心悟&&星际  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示