poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

A Simple Problem with Integers

Time Limit: 1 Sec  Memory Limit: 256 MB

题目连接

http://poj.org/problem?id=3468

Description

You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

 

Output

 

You need to answer all Q commands in order. One answer in a line.
 

 

Sample Input

 

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4


 

Sample Output

 

4
55
9
15

 

HINT

 

 

 

题意

 

 区间加,区间查询和

 

题解:

 

线段树,记住懒操作~

 

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
int Num;
char CH[20];
//const int inf=0x7fffffff;   //нчоч╢С
const int inf=0x3f3f3f3f;
/*

inline void P(int x)
{
    Num=0;if(!x){putchar('0');puts("");return;}
    while(x>0)CH[++Num]=x%10,x/=10;
    while(Num)putchar(CH[Num--]+48);
    puts("");
}
*/
//**************************************************************************************
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void P(int x)
{
    Num=0;if(!x){putchar('0');puts("");return;}
    while(x>0)CH[++Num]=x%10,x/=10;
    while(Num)putchar(CH[Num--]+48);
    puts("");
}
struct node
{
    int l,r;
    ll sum,add;
    void fun(ll tmp)
    {
        add+=tmp;
        sum+=(r-l+1)*tmp;
    }
}a[maxn*4];
ll d[maxn];
void relax(int x)
{
    if(a[x].add)
    {
        a[x<<1].fun(a[x].add);
        a[x<<1|1].fun(a[x].add);
        a[x].add=0;
    }
}
void build(int x,int l,int r)
{
    a[x].l=l,a[x].r=r;
    if(l==r)
    {
        a[x].sum=d[l];
    }
    else
    {
        int mid=(l+r)>>1;
        build(x<<1,l,mid);
        build(x<<1|1,mid+1,r);
        a[x].sum=a[x<<1].sum+a[x<<1|1].sum;
    }
}
void update(int x,int st,int ed,ll c)
{
    int l=a[x].l,r=a[x].r;
    if(st<=l&&r<=ed)
        a[x].fun(c);
    else
    {
        relax(x);
        int mid=(l+r)>>1;
        if(st<=mid)update(x<<1,st,ed,c);
        if(ed>mid) update(x<<1|1,st,ed,c);
        a[x].sum=a[x<<1].sum+a[x<<1|1].sum;
    }
}
ll query(int x,int st,int ed)
{
    int l=a[x].l,r=a[x].r;
    if(st<=l&&r<=ed)
        return a[x].sum;
    else
    {
        relax(x);
        int mid=(l+r)>>1;
        ll sum1=0,sum2=0;
        if(st<=mid)
            sum1=query(x<<1,st,ed);
        if(ed>mid)
            sum2=query(x<<1|1,st,ed);
        return sum1+sum2;
    }
}
int main()
{
    int n=read(),m=read();
    for(int i=1;i<=n;i++)
        d[i]=read();
    build(1,1,n);
    char s[3];
    int bb,cc,dd;
    for(int i=0;i<m;i++)
    {
        scanf("%s",s);
        if(s[0]=='Q')
        {
            bb=read(),cc=read();
            printf("%lld\n",query(1,bb,cc));
        }
        else
        {
            bb=read(),cc=read(),dd=read();
            update(1,bb,cc,dd);
        }
    }
}

 

posted @ 2015-04-22 15:16  qscqesze  阅读(255)  评论(0编辑  收藏  举报