cogs 36.求和问题

36. 求和问题

★   输入文件:sum.in   输出文件:sum.out   简单对比
时间限制:1.2 s   内存限制:128 MB

【问题描述
    在一个长度为n的整数数列中取出连续的若干个数,并求它们的和。
【输入格式】
    输入由若干行组成,第一行有一个整数n
    第二行有n个整数
    第三行有一个整数m
    下面m行,每行两个整数i与j(i<=j),表示求和的起始和终止位置。
【输出格式】

    输出有m行, 每行一个整数,表示这个数段数列的和。

【输入样例】
输入文件
8
2 3 4 7 8 9 10 234 
5
2 3
4 7
1 3
7 7 
7 8 
 
输出文件

34
9
10 
244
【数据规模】
对于40%的数据,n<=1000,m<=1000,数列中的数不超过32767,数列的和不超过10^9
对于70%的数据,n<=10000,m<=2*10^5,数列中的数不超过32767
对于100%的数据,n<=10000,m<=2*10^5,数列中的数不超过10^9
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define ll long long
 6 
 7 using namespace std;
 8 const int N=10010;
 9 
10 ll a[N];
11 ll sum[N];
12 
13 inline ll read()
14 {
15     ll x=0;
16     char c=getchar();
17     while(c<'0'||c>'9')c=getchar();
18     while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
19     return x;
20 }
21 
22 int main()
23 {
24     
25     freopen("sum.in","r",stdin);
26     freopen("sum.out","w",stdout);
27     
28     int n=read();
29     
30     a[1]=read();
31     sum[1]=a[1];
32     
33     for(int i=2;i<=n;i++)
34     {
35         a[i]=read();
36         sum[i]=sum[i-1]+a[i];
37     }
38     
39     int m=read();
40     
41     for(int i=1;i<=m;i++)
42     {
43         int start=read();
44         int end=read();
45         
46         printf("%lld\n",sum[end]-sum[start-1]);
47     }
48     return 0;
49 }

 

posted @ 2017-06-13 22:41  ioioioioioio  阅读(218)  评论(0编辑  收藏  举报