bzoj 3224 平衡树 treap

来源:互联网 发布:网络刷到被骗了怎么办 编辑:程序博客网 时间:2024/05/17 12:04

代码:

#include <cstdio>#include <algorithm>#define N 100005using namespace std;inline int read() {    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}struct date{    int l, r, key, siz, w, rnd;};date tr[N * 2];int rt, n, size, opt, ans, x;inline void update( int k ) {    tr[k].siz = tr[tr[k].l].siz + tr[tr[k].r].siz + tr[k].w;}inline void lturn( int &k ) {    int t = tr[k].r; tr[k].r = tr[t].l;    tr[t].l = k; tr[t].siz = tr[k].siz;    update(k); k = t;}inline void rturn( int &k ) {    int t = tr[k].l; tr[k].l = tr[t].r;    tr[t].r = k; tr[t].siz = tr[k].siz;    update(k); k = t;}inline int rand() {    static int seed = 7;    return seed = (int)seed*48271LL%2147483647;}void insert( int &k, int x ) {    if ( !k ) {        size++; k = size;        tr[k].siz = tr[k].w = 1;        tr[k].key = x;        tr[k].rnd = rand();        return;    }    tr[k].siz++;    if ( x == tr[k].key ) tr[k].w++;    else if ( x > tr[k].key ) {        insert( tr[k].r, x );        if( tr[tr[k].r].rnd < tr[k].rnd ) lturn(k);    }     else {        insert( tr[k].l, x );        if( tr[tr[k].l].rnd < tr[k].rnd ) rturn(k);    }}void del( int &k, int x ) {    if ( !k ) return;    if ( x == tr[k].key ) {        if ( tr[k].w > 1 ) {            tr[k].siz--;            tr[k].w--;            return;        }        if ( tr[k].l * tr[k].r == 0 ) k = tr[k].l + tr[k].r;        else if ( tr[tr[k].l].rnd < tr[tr[k].r].rnd ) rturn(k), del(k, x);        else lturn(k), del(k, x);    }    else if ( x > tr[k].key ) tr[k].siz--,del(tr[k].r, x);    else tr[k].siz--,del(tr[k].l, x);}int query_rank( int k, int x ) {    if ( !k ) return 0;    if ( x == tr[k].key ) return tr[tr[k].l].siz + 1;    if ( x < tr[k].key ) return query_rank(tr[k].l, x);    else return tr[tr[k].l].siz + tr[k].w + query_rank(tr[k].r, x);}int query_num( int k, int x ) {    if ( !k ) return 0;    if ( x <= tr[tr[k].l].siz ) return query_num( tr[k].l, x );    if ( x > tr[k].w + tr[tr[k].l].siz ) return query_num( tr[k].r, x - tr[k].w-tr[tr[k].l].siz);    return tr[k].key;}void query_pro ( int k, int x ) {    if ( !k ) return;    if ( x > tr[k].key ) {        ans = tr[k].key;        query_pro( tr[k].r, x );    }    else query_pro( tr[k].l, x );}void query_sub ( int k, int x ) {    if ( !k ) return;    if ( x < tr[k].key ) {        ans = tr[k].key;        query_sub( tr[k].l, x );    }    else query_sub( tr[k].r, x );}int main() {    n = read();    for ( register int i = 1; i <= n; i++ ) {        opt = read(); x = read();        switch(opt) {            case 1: insert(rt, x);break;            case 2: del(rt, x);break;            case 3: printf( "%d\n", query_rank(rt, x) );break;            case 4: printf( "%d\n", query_num(rt, x) );break;            case 5: query_pro(rt, x);printf( "%d\n", ans );break;            case 6: query_sub(rt, x);printf( "%d\n", ans );break;        }    }    return 0;}
原创粉丝点击