#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define R0(i,n) for(int i=0;i<n;++i)
#define R1(i,n) for(int i=1;i<=n;++i)
#define INF 0x7fffffff
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int tr[800001],a[200005];
void build(int k,int x,int y){//建樹
if(x==y){tr[k]=a[x];return;}
int mid=(x+y)>>1;
build(k<<1,x,mid);
build(k<<1|1,mid+1,y);
tr[k]=tr[k<<1]+tr[k<<1|1];
}
int work(int k,int x,int y,int aa,int b){//區間求和
int mid,sum=0;
if (aa<=x&&y<=b)return tr[k];
mid=(x+y)>>1;
if (aa<=mid) sum+=work(k<<1,x,mid,aa,b);
if (b>mid) sum+=work(k<<1|1,mid+1,y,aa,b);
return sum;
}
void insert(int k,int x,int y,int aa){//單點修改,,就是砍了
int mid;
if (x==y&&x==aa){tr[k]=0;return;}
mid=(x+y)>>1;
if (aa<=mid) insert(k<<1,x,mid,aa);
else insert(k<<1|1,mid+1,y,aa);
tr[k]=tr[k<<1]+tr[k<<1|1];
}
int main(){
int n=read(),m,i,j,l,r,sum;
double ans;
R1(i,n)a[i]=read();
build(1,1,n);
m=read();
R1(i,m){
l=read(),r=read();
sum=work(1,1,n,l,r);
insert(1,1,n,(l+r)/2);
ans=sum*3.14;
printf("%0.2f\n",ans);
}
}
codevs1369 xth砍樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.