TOJ 3515

import java.util.Scanner;

public class TOJ3515 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
x = new int[SIZE];
d = new int[SIZE];
for (int i = 0; i < t; i++) {
x_count = 1;
d_count = 1;

        int n = sc.nextInt();
        mid = sc.nextInt();
        for (int j = 1; j < n; j++) {
            int c = sc.nextInt();
            add(c);
        }
        n = sc.nextInt();
        for (int j = 0; j < n; j++) {
            String cmd = sc.next();
            if(cmd.toCharArray()[0]=='a'){
                int a = sc.nextInt();
                add(a);
            }else if(cmd.toCharArray()[0]=='m'){
                System.out.println(mid);
            }
        }
    }
}
static int mid = 0;
static int x[] ; 
static int d[] ; 
static int SIZE = 15;
//  static int SIZE = 110001;
static int x_count;
static int d_count;
static void add(int c){
    if(c<mid){
        d_add(c);
        if(d_count>x_count){
            int cc = d_delete();
            x_add(mid);
            mid = cc;
        }
    }else{
        x_add(c);
        if(x_count>d_count+1){
            int cc = x_delete();
            d_add(mid);
            mid = cc;
        }
    }
}
private static int d_delete() {
    int tmp = d[1];
    d[1] = d[--d_count];
    d_down(1);
    return tmp;
}
private static int x_delete() {
    int tmp = x[1];
    x[1] = x[--x_count];
    x_down(1);
    return tmp;
}
static void d_add(int a){
    d[d_count++] = a;
    d_up(d_count-1);
}
static void x_add(int a){
    x[x_count++] = a;
    x_up(x_count-1);
}
static void x_up(int curr){
    while(curr>1){
        int p = curr/2;
        if(x[p]>x[curr]){
            swap(x,p,curr);
        }
        curr = p;
    }
}
static void d_up(int curr){
    while(curr>1){
        int p = curr/2;
        if(d[p]<d[curr]){
            swap(d,p,curr);
        }
        curr = p;
    }
}

static void d_down(int id){
    int l = id*2;
    int r = id*2+1;
    int max = d[id];
    int max_index = -1;
    while(l<d_count){
        max = d[id];
        max_index = id;
        if(max<d[l]) {
            max = d[l];
            max_index = l;
        }
        if(r<d_count&&max<d[r]) {
            max = d[r];
            max_index = r;
        }
        if(max_index==id) break;
        swap(d,id,max_index);
        id = max_index;
        l = id*2;
        r = id*2+1;
    }
}
static void x_down(int id){
    int l = id*2;
    int r = id*2+1;
    int min = x[id];
    int min_index = -1;
    while(l<x_count){
        min = x[id];
        min_index = id;
        if(min>x[l]) {
            min = x[l];
            min_index = l;
        }
        if(r<x_count&&min>x[r]) {
            min = x[r];
            min_index = r;
        }
        if(min_index==id) break;
        swap(x,id,min_index);
        id = min_index;
        l = id*2;
        r = id*2+1;
    }
}
static void swap(int d[],int a,int b){
    int tmp = d[a];
    d[a] = d[b];
    d[b] = tmp;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值