2027-操作序列

描述

给出一初始序列a1, a2,...,an,下面有m个操作(x, l, r) : 对于a[l], a[l+1],...,a[r]都加上x. 输出m个操作结束后的序列.

输入

第一行两个整数n,m(0 <= n,m <= 100000),n表序列{A}的长度, m表操作的个数。 第二行有n 个整数ai(-10000 <= ai <= 10000)。 下面m行,每一行表示一个操作,一个操作表示为3个整数x, l, r(1 <= l <= r <= n, |x|<=1000)。

输出

输出结果序列。

样例输入

5 3

1 2 3 -4 5

2 1 1

-3 3 5

0 1 5

样例输出

3 2 0 -7 2

#include<iostream>
using namespace std;
#define maxn 100001
int g_count;int n;
struct node
{
    int left;
    int right;
    int count;
};
struct node A[maxn*4];
void buildtree(struct node *A,int index,int left,int right)
{
    A[index].left=left;
        A[index].right=right;
        A[index].count=0;
    if (left==right)
    {
        
        
        return;
    }
    int mid=(left+right)>>1;
    buildtree(A,(index<<1)+1,left,mid);
    buildtree(A,(index<<1)+2,mid+1,right);
    return;
}

void insert(struct node *A,int index,int start,int end,int key)
{
    if (A[index].left==start&&A[index].right==end)
    {
        A[index].count+=key;
        return;
    }
    int mid=(A[index].left+A[index].right)>>1;
    if (end<=mid)
    {
        insert(A,(index<<1)+1,start,end,key);
    }
    else
        if (start>mid)
        {
            insert(A,(index<<1)+2,start,end,key);
        }
        else
        {
            insert(A,(index<<1)+1,start,mid,key);
            insert(A,(index<<1)+2,mid+1,end,key);
        }
    return;
}
void query(struct node *A,int index,int sum)
{
    if (A[index].left==A[index].right)
    {
        g_count++;
        A[index].count+=sum;
        if(g_count!=n)
        cout<<A[index].count<<' ';
        else
            cout<<A[index].count<<endl;
        return;
    }
    A[index].count+=sum;
    query(A,(index<<1)+1,A[index].count);
    query(A,(index<<1)+2,A[index].count);
    return ;
}
int main()
{
    //freopen("aa.txt","r",stdin);
    int m,start,end,key,a;
    scanf("%d%d",&n,&m);
    buildtree(A,0,1,n);
    for (int i=0;i<n;i++)
    {
        scanf("%d",&a);
        insert(A,0,i+1,i+1,a);
    }

    for (int j=0;j<m;j++)
    {
        scanf("%d%d%d",&key,&start,&end);
        insert(A,0,start,end,key);
    }
    g_count=0;
    query(A,0,0);
    return 0;
}

  

原文地址:https://www.cnblogs.com/Rosanna/p/3438697.html