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.