poj 3468 A Simple Problem with Integers

Source Code

Problem: 3468		User: shu_dayang
Memory: 4256K		Time: 1704MS
Language: C++		Result: Accepted
Source Code
#include<iostream>
#include<cstdio>
#include<cstring>
#define MID(a,b)  ((a + b) >> 1)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
using namespace std;

const int MAXN = 100005;

LL sum[MAXN << 2];
LL mark[MAXN << 2];

void PushUp(int rt)
{
    sum[rt] = sum[rt << 1] + sum[(rt << 1) + 1];
}

void Build(int l,int r,int rt)
{
    mark[rt] = 0;
    if(l == r)
    {
        scanf("%I64d",&sum[rt]);
        return;
    }
    int m = MID(l,r);
    Build(lson);
    Build(rson);
    PushUp(rt);
}

void PushDown(int x,int rt)
{
    if(mark[rt])
    {
        mark[rt<<1] += mark[rt];
        mark[rt<<1|1] += mark[rt];
        sum[rt<< 1] += (x-(x >> 1)) * mark[rt];
        sum[rt << 1 | 1] += (x >> 1) *mark[rt];
        mark[rt] = 0;
    }
}

void Update(int L,int R,int c,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        mark[rt]+=c;
        sum[rt]+=(LL)c*(r-l+1);
        return;
    }
    PushDown(r-l+1,rt);
    int m = MID(l,r);
    if(L<=m)
        Update(L,R,c,lson);
    if(R>m)
        Update(L,R,c,rson);
        PushUp(rt);
}

LL Query(int L,int R, int l,int r,int rt)
{
    if(L <= l && r <= R)
    {
        return sum[rt];
    }
    PushDown(r-l+1,rt);
    int m = MID(l,r);
    LL ret = 0;
    if(L<=m)
        ret+=Query(L,R,lson);
    if(R>m)
        ret+=Query(L,R,rson);
    return ret;
}

int main()
{
    int N,Q;
    int a,b,c;
    char ch[5];
    scanf("%d%d",&N,&Q);
    Build(1,N,1);
    for(int i = 0;i<Q;i++)
    {
        scanf("%s",ch);
        if(ch[0] == 'Q')
        {
            scanf("%d%d",&a,&b);
            printf("%I64d\n",Query(a,b,1,N,1));
        }
        else
        {
            scanf("%d%d%d",&a,&b,&c);
            Update(a,b,c,1,N,1);
        }
    }

    return 0;
}

 

posted @ 2015-07-22 13:48  杨永华  阅读(110)  评论(0编辑  收藏  举报