题意:要求在N个数的序列中支持以下操作:
1:将第X个元素加上Y
2:询问当前K大值
n<=30000,m<=50000
思路:树状数组套主席树
Tyvj又炸了,还不知道对不对
var t:array[..12]of record
l,r,s:longint;
end;
d:array[..,..]of longint;
a,save,q,root,hash:array[..]of longint;
b:array[..]of longint;
n,m,i,j,x,cnt,u,que,s,sum,tmp,len:longint;
ch:string; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure update(l,r:longint;var p:longint;x,v:longint);
var mid:longint;
begin
inc(cnt); t[cnt]:=t[p];
p:=cnt; t[p].s:=t[p].s+v;
if l=r then exit;
mid:=(l+r)>>;
if x<=mid then update(l,mid,t[p].l,x,v)
else update(mid+,r,t[p].r,x,v);
end; function query(l,r,k:longint):longint;
var mid,s,i:longint;
begin
if l=r then exit(l);
s:=;
mid:=(l+r)>>;
for i:= to len do s:=s+t[t[q[i]].l].s;
if s>=k then
begin
for i:= to len do q[i]:=t[q[i]].l;
exit(query(l,mid,k));
end
else
begin
for i:= to len do q[i]:=t[q[i]].r;
exit(query(mid+,r,k-s));
end;
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=b[(l+r)>>];
repeat
while mid<b[i] do inc(i);
while mid>b[j] do dec(j);
if i<=j then
begin
swap(b[i],b[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function find(x:longint):longint;
var l,r,mid:longint;
begin
l:=; r:=u;
while l<=r do
begin
mid:=(l+r)>>;
if hash[mid]=x then exit(mid);
if hash[mid]>x then l:=mid+
else r:=mid-;
end;
end; begin
assign(input,'tyvj1601.in'); reset(input);
assign(output,'tyvj1601.out'); rewrite(output);
readln(n);
for i:= to n do
begin
read(a[i]); b[i]:=a[i];
end;
que:=n;
for i:= to n do save[i]:=a[i];
readln(m);
for i:= to m do
begin
readln(ch); x:=;
if ch[]='Q' then
begin
for j:= to length(ch) do x:=x*+ord(ch[j])-ord('');
d[i,]:=; d[i,]:=x; continue;
end;
d[i,]:=; s:=;
for j:= to length(ch) do
begin
if ch[j]=' ' then inc(s)
else d[i,s]:=d[i,s]*+ord(ch[j])-ord('');
end;
if ch[]='A' then d[i,]:=-d[i,];
end;
for i:= to m do
if d[i,]= then
begin
a[d[i,]]:=a[d[i,]]+d[i,];
if a[d[i,]]> then
begin
inc(que); b[que]:=a[d[i,]];
end;
end;
qsort(,que);
hash[]:=b[]; u:=;
for i:= to que do
if b[i]<>b[i-] then begin inc(u); hash[u]:=b[i]; end;
sum:=n;
for i:= to n do
begin
tmp:=find(save[i]);
j:=i;
while j<=n do
begin
update(,u,root[j],tmp,);
j:=j+lowbit(j);
end;
end;
for i:= to m do
if d[i,]= then
begin
len:=; j:=n;
while j> do
begin
inc(len); q[len]:=root[j];
j:=j-lowbit(j);
end;
if sum<d[i,] then writeln(-)
else writeln(hash[query(,u,d[i,])]);
end
else
begin
tmp:=find(save[d[i,]]);
j:=d[i,];
while j<=n do
begin
update(,u,root[j],tmp,-);
j:=j+lowbit(j);
end;
save[d[i,]]:=save[d[i,]]+d[i,];
if save[d[i,]]> then
begin
tmp:=find(save[d[i,]]);
j:=d[i,];
while j<=n do
begin
update(,u,root[j],tmp,);
j:=j+lowbit(j);
end;
end
else dec(sum);
end; writeln(sum);
close(input);
close(output);
end.