用Lazy标记,延迟更新,
标记如果不开long long 就会WA
标记如果不开long long 就会WA
我计算了一下,10W*10W是超int
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
#define mem(a) memset(a,0,sizeof(a));
#define mem_1(a) memset(a,-1,sizeof(a));
#define sf(a) scanf("%d",&a)
#define lson l,mid,i<<1
#define rson mid+1,r,i<<1|1
#define sff(a,b) scanf("%d%d",&a,&b)
#define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define LL long long
const int INF = 0x7FFFFFFF;
const int MAXN = 100100;
const double PI = acos(-1.0);
const double esp = 1e-10;
using namespace std;
struct node
{
int l,r;
LL sum,num,lazy;
int mid(){return (l+r) >>1 ;}
}Tree[MAXN << 2];
void pushUp(int i)
{
Tree[i].sum = Tree[i<<1].sum + Tree[i<<1|1].sum;
}
void pushDown(int i)
{
if(Tree[i].lazy)
{
Tree[i<<1].lazy += Tree[i].lazy;
Tree[i<<1|1].lazy += Tree[i].lazy;
Tree[i<<1].sum += (Tree[i<<1].r - Tree[i<<1].l +1) * Tree[i].lazy;
Tree[i<<1|1].sum += (Tree[i<<1|1].r - Tree[i<<1|1].l+1) * Tree[i].lazy;
Tree[i].lazy = 0;
}
}
void B_tree(int l,int r,int i)
{
Tree[i].l = l;
Tree[i].r = r;
Tree[i].lazy = 0;
if(l == r)
{
scanf("%lld",&Tree[i].num);
Tree[i].sum = Tree[i].num;
return ;
}
int mid = (l+r)>>1;
B_tree(lson);
B_tree(rson);
pushUp(i);
}
void updata_tree(int l,int r,int i,LL k)
{
if(Tree[i].l ==l && r == Tree[i].r)
{
Tree[i].lazy += k;
Tree[i].sum += ((LL)(Tree[i].r - Tree[i].l +1))*k;
return ;
}
pushDown(i);
int mid = Tree[i].mid();
if(r <= mid) updata_tree(l,r,i<<1,k);
else if(mid < l) updata_tree(l,r,i<<1|1,k);
else
{
updata_tree(lson,k);
updata_tree(rson,k);
}
pushUp(i);
}
LL Query(int l,int r,int i)
{
if(Tree[i].l == l && Tree[i].r == r)
{
return Tree[i].sum;
}
pushDown(i);
int mid = Tree[i].mid();
if(r<=mid) return Query(l,r,i<<1);
else if(mid < l) return Query(l,r,i<<1|1);
else
{
return Query(lson) + Query(rson);
}
}
int main()
{
int n,m;
char c;
int form,to;
sff(n,m);
B_tree(1,n,1);
while(m--)
{
cin >> c;
if(c=='Q')
{
sff(form,to);
updata_tree(form,to,1,0);
printf("%lld\n",Query(form,to,1));
}
else
{
LL K;
sff(form,to);
scanf("%lld",&K);
updata_tree(form,to,1,K);
}
}
return 0;
}