萌新求救!!!3个tle,其他A。qwq dalao帮忙看看一下w
查看原帖
萌新求救!!!3个tle,其他A。qwq dalao帮忙看看一下w
58146
旧时兰台楼主2017/10/4 11:47
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
const long long maxn=1000000*3;
struct node{
    long long left,right,mid,sum,tag;
}tree[maxn];
void build(long long num,long long l,long long r){
         tree[num].left=l;
         tree[num].right=r;
         tree[num].mid=(l+r)/2;
         if (r>l){
             build(num*2,tree[num].left,tree[num].mid);
               build(num*2+1,tree[num].mid+1,tree[num].right);
         }
} 
void add(long long num,long long x,long long d){
    if (tree[num].left== tree[num].right)tree[num].sum+=d;
        else{
            if (x<=tree[num].mid) add(2*num,x,d);
                else add(2*num+1,x,d);
            tree[num].sum=tree[2*num].sum+tree[2*num+1].sum;
    }
 }
long long find(long long num,long long l,long long r){
            long long ans=0;
            if(l<=tree[num].left&&tree[num].right<=r) return tree[num].sum;
                else{
                    if(l<=tree[num].mid)  ans+=find(2*num,l,r); 
                    if(r>tree[num].mid)  ans+=find(2*num+1,l,r); 
                    return ans;
                }
}
int main(){
    long long q[maxn];
    long long a,x,y,k,n,m,z,s=0;
    memset(tree,0,sizeof(tree));
    cin>>n>>m;
    build(1,1,n);
    for(long long i=1;i<=n;i++){
        cin>>z;
        add(1,i,z);
    }
    for(long long i=1;i<=m;i++){
        cin>>a>>x>>y;
        if (a==1) {
            cin>>k;
            for(long long j=x;j<=y;j++) add(1,j,k);
        }
            else {
                s++;
                q[s]=find(1,x,y);
            } 
    }
    for(long long i=1;i<=s;i++)
        cout<<q[i]<<endl;
    return 0;
}
2017/10/4 11:47
加载中...