算法:树状数组。
program P1324;
const
maxn=200000;
var
a,tree:array [0..maxn] of longint;
n,m,temp:longint;
procedure add(x,y:longint);
begin
while x<=n do
begin
inc(tree[x],y);
x:=x+(x and (-x));
end;
end;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
add(i,a[i]);//从i开始为之后的树状数组元素加入a[i]。
end;
readln;
end;
function down(x:longint):longint;
begin
down:=0;
while x>0 do
begin
inc(down,tree[x]);
x:=x-(x and (-x));
end;
end;
procedure main;
var
i,x,y:longint;
ans:real;
begin
readln(m);
for i:=1 to m do
begin
readln(x,y);
temp:=(x+y) >> 1;
ans:=down(y)-down(x-1);//计算从x到y的区间和,为1~y的区间和-1~x-1的区间和。
writeln(ans*3.14:0:2);
if a[temp]<>0 then//如果当前位置不为0,那么就会影响temp及temp之后的区间和,因此还要进行修改。
begin
add(temp,-a[temp]);//temp之前的数已影响不到,所以应该修改temp之后的数组,让其减去a[temp]。
a[temp]:=0;//同时a[temp]置0,这样在下次再找到这个位置是无需再次进行修改。
end;
end;
end;
begin
assign(input,'P1324.in'); reset(input);
assign(output,'P1324.out'); rewrite(output);
init;
main;
close(input); close(output);
end.