线段树单点更新

来源:互联网 发布:遗传算法与svm 编辑:程序博客网 时间:2024/05/29 09:51
动态查询区间第k小数

其中Push表示入栈,key是不超过105的正整数;Pop表示出栈;PeekMedian表示查中值。

#include <stack>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define maxn 100000+10#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define root 1,maxn,1int sum[maxn<<2];int n;int pushUp(int rt){    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void update(int l,int r,int rt,int p,int v){    if( l == r )    {        if( v )sum[rt]++;        else sum[rt]--;        return ;    }    int m = (l+r)>>1;    if( p <= m )update(lson,p,v);    else update(rson,p,v);    pushUp(rt);}int query(int l,int r,int rt,int num){     if( l == r ) return l;     int m = (l+r)>>1;     if( sum[rt<<1] >= num )return query(lson,num);     else return query(rson,num-sum[rt<<1]);}int main(){    cin >> n;    stack<int>s;    char st[100];    while( n-- )    {        int flag = 1;        scanf("%s",st);        if( st[1] == 'u' )        {            int a;            scanf("%d",&a);            s.push(a);            update(root,a,1);        }        else if( st[1] == 'o' )        {            if( !s.empty() ){                int a = s.top();                s.pop();                update(root,a,0);                printf("%d\n",a);            }else flag = 0;        }        else if( st[1] == 'e' )        {            int x = s.size();            if(!x)flag = 0;            else {                x = (x+1) >> 1;                printf("%d\n",query(root,x));            }        }        if( !flag )printf("Invalid\n");    }}


0 0