(1)
#include<stdio.h>
#define N 50000
struct node{
int x,y;
long long sum;
}t[N<<2];
int a[N];
void Build_Tree(int l,int r,int i)
{
t[i].x=l;
t[i].y=r;
if(l==r)
{
t[i].sum=a[l];
}
else
{
int mid=(l+r)>>1;
Build_Tree(l,mid,i<<1);
Build_Tree(mid+1,r,i<<1|1);
t[i].sum=t[i<<1].sum+t[i<<1|1].sum;
}
}
long long Query_Tree(int L,int R,int i)
{
if(R<t[i].x||t[i].y<L)
return 0;
else
{
if(L<=t[i].x&&t[i].y<=R)
return t[i].sum;
else
return Query_Tree(L,R,i<<1)+Query_Tree(L,R,i<<1|1);
}
}
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
Build_Tree(1,n,1);
int q;
scanf("%d",&q);
while(q--)
{
int i,l;
scanf("%d%d",&i,&l);
long long ans=Query_Tree(i,i+l-1,1);
printf("%lld\n",ans);
}
return 0;
}
(2)
#include<stdio.h>
#define N 50000
struct node{
int x,y;
long long sum;
}t[N<<2];
int a[N];
void Build_Tree(int l,int r,int i)
{
t[i].x=l;
t[i].y=r;
if(l==r)
{
t[i].sum=a[l];
}
else
{
int mid=(l+r)>>1;
Build_Tree(l,mid,i<<1);
Build_Tree(mid+1,r,i<<1|1);
t[i].sum=t[i<<1].sum+t[i<<1|1].sum;
}
}
long long Query_Tree(int L,int R,int i)
{
if(L<=t[i].x&&R>=t[i].y)
return t[i].sum;
else
{
int mid=(t[i].x+t[i].y)>>1;
if(mid>=R)
return Query_Tree(L,R,i<<1);
else if(mid<L)
return Query_Tree(L,R,i<<1|1);
else
return Query_Tree(L,R,i<<1)+Query_Tree(L,R,i<<1|1);
}
}
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
Build_Tree(1,n,1);
int q;
scanf("%d",&q);
while(q--)
{
int i,l;
scanf("%d%d",&i,&l);
long long ans=Query_Tree(i,i+l-1,1);
printf("%lld\n",ans);
}
return 0;
}