PKU 2761 FEED THE DOGS USING SBT

http://hi.baidu.com/raulliubo/blog/item/2f635b34f75a434a251f14b5.html

一开始老是WA。吓了我一身汗,还以为SBT啥地方写错了。。。结果最后一看。。qsort写错了。我真无语了。

my ugly code:

 


var
    a, key, size, lch, rch : array[0 .. 100001] of longint;
    ans, x, y, num, feed : array[0 .. 50001] of longint;
    root, tot, n, m, i, j, temp : longint;
procedure qsort(l, r : longint);
var
    i, j, mid, temp : longint;
begin
    i := l; j := r; mid := x[(i+j) shr 1];
    repeat
        while x[i] < mid do inc(i);
        while x[j] > mid do dec(j);
        if i <= j then begin
            temp := x[i]; x[i] := x[j]; x[j] := temp;
            temp := y[i]; y[i] := y[j]; y[j] := temp;
            temp := num[i]; num[i] := num[j]; num[j] := temp;
            temp := feed[i]; feed[i] := feed[j]; feed[j] := temp;
            inc(i); dec(j);
        end;
    until i > j;
    if i < r then qsort(i, r);
    if l < j then qsort(l, j);
end;
procedure rightrotate(var now : longint);
begin
    temp := lch[now];
    lch[now] := rch[temp];
    rch[temp] := now;
    size[temp] := size[now];
    size[now] := size[lch[now]] + size[rch[now]] + 1;
    now := temp;
end;
procedure leftrotate(var now : longint);
begin
    temp := rch[now];
    rch[now] := lch[temp];
    lch[temp] := now;
    size[temp] := size[now];
    size[now] := size[lch[now]] + size[rch[now]] + 1;
    now := temp;
end;
procedure insert(var now, value : longint);
begin
    if now = 0 then begin
        inc(tot);
        now := tot;
        key[now] := value;
        size[now] := 1;
        lch[now] := 0;
        rch[now] := 0;
    end
    else begin
        inc(size[now]);
        if value < key[now] then begin
            insert(lch[now], value);
            if size[lch[lch[now]]] > size[rch[now]] then
                rightrotate(now);
        end
        else begin
            insert(rch[now], value);
            if size[rch[rch[now]]] > size[lch[now]] then
                leftrotate(now);
        end;
    end;
end;
function delete(var now : longint; value : longint) : longint;
begin
    dec(size[now]);
    if (value = key[now]) or (value < key[now]) and (lch[now] = 0) or (value > key[now]) and (rch[now] = 0) then begin
        delete := key[now];
        if (lch[now] = 0) or (rch[now] = 0) then
            now := lch[now] + rch[now]
        else
            key[now] := delete(lch[now], key[now] + 1);
    end
    else
        if value < key[now] then
            delete := delete(lch[now], value)
        else
            delete := delete(rch[now], value);
end;
function select(var now : longint; k : longint) : longint;
begin
    if k = size[lch[now]] + 1 then
        exit(key[now]);
    if k <= size[lch[now]] then
        select := select(lch[now], k)
    else
        select := select(rch[now], k - size[lch[now]] - 1);
end;
begin
    readln(n, m);
    for i := 1 to n do
        read(a[i]);
    for i := 1 to m do begin
        readln(x[i], y[i], feed[i]);
        if x[i] > y[i] then begin
            temp := x[i]; x[i] := y[i]; y[i] := temp;
        end;
        num[i] := i;
    end;
    qsort(1, m);
    y[0] := 0;
    for i := 1 to m do begin
        if x[i] > y[i-1] then begin
            tot := 0;
            root := 0;
            size[0] := 0;
            for j := x[i] to y[i] do
                insert(root, a[j]);
        end
        else begin
            for j := x[i-1] to x[i] - 1 do
                delete(root, a[j]);
            for j := y[i-1] + 1 to y[i] do
                insert(root, a[j]);
        end;
        ans[num[i]] := select(root, feed[i]);
    end;
    for i := 1 to m do writeln(ans[i]);
end.
posted @ 2009-01-04 12:25  jesonpeng  阅读(209)  评论(0编辑  收藏  举报