【ACWING】【802区间和】

假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。

现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。

接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。

输入格式

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含两个整数 x 和 c。

再接下来 m 行,每行包含两个整数 l 和 r。

输出格式

共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围

−109≤x≤109,
1≤n,m≤105,
−109≤l≤r≤109,
−10000≤c≤10000

输入样例:

3 3
1 2
3 6
7 5
1 3
4 6
7 8

输出样例:

8
0
5

 

#include
#include
using namespace std;
int main()
{
    int n,m;

    map record;
    cin>>n>>m;
    for(int i=0;i>x>>c;
        record[x]+=c;
    }
    auto i=(++record.begin());
    while(i!=record.end())
    {
        auto tmp=--i;
        i++;
        i->second+=tmp->second;
        i++;
    }
    while(m--)
    {
        int l,r,left,right;
        cin>>l>>r;
        auto l1=record.find(l);
        auto r1=record.find(r);
        if(l1!=record.end())
        {
            if(l1== record.begin())
            {
                left=0;
            }else{
                left=(--l1)->second;
            }
        }else{
            record[l]=0;
            l1=record.find(l);
            if(l1== record.begin())
            {
                left=0;
                record.erase(l1);
            }
            else{
                left=(--l1)->second;
                record.erase(++l1);
            }

        }

        if(r1!=record.end())
        {
            right=r1->second;
        }else{
            record[r]=0;
            r1=record.find(r);
            if(r1== record.begin())
            {
                right=0;
                record.erase(r1);
            }
            else{
                right=(--r1)->second;
                record.erase(++r1);
            }

        }
        cout<< right-left<

你可能感兴趣的:(ACWING,c++,算法,开发语言)