#include<iostream>
#include<string.h>
#include<cmath>
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<iomanip>
#define inf 0x3f3f3f3f
#define ios() std::ios::sync_with_stdio(false)
#define cin() cin.tie(0)
#define cout() cout.tie(0)
#define mem1(a) memset(a,0,sizeof(a))
#define mem2(b) memset(b,'\0',sizeof(b))
typedef long long ll;
using namespace std;
//10 5
//1 2 3 4 5 6 7 8 9 10 //十個數
//Q 4 4 ->4//查詢操作:查詢區間[4,4]內所有和
//Q 1 10 ->55
//Q 2 4 ->9
//C 3 6 3 //插入操作:對[3,6]中每一個數+3
//Q 2 4 ->15
// [1,10]
// / \
// [1,5] [6,10]
// / \ / \
// [1,3] [4,5] [6,8] [9,10]
// / \ / \ / \ / \
// [1,2] 3 4 5 [6,7] 8 9 10
// / \ / \
// 1 2 6 7
ll sum[400020],lazy[400020];
void build(int left,int right,int point)
//傳入左區間、右區間、根節點
{
if(left==right)
{
cin>>sum[point];
return;
}
int mid=(left+right)/2;//>>1
build(left,mid,point<<1);//point<<1//先建立左節點
build(mid+1,right,point<<1|1);//建立右節點,節點數+1
//|位運算,先把a,b轉化成二進制,然后位相或,有1出1,無1出0,比直接+1運算快
sum[point]=sum[point<<1]+sum[point<<1|1];//左右節點相加
}
void pushdown(int point,int len)
{
if(lazy[point])//表示有過懶惰標記,進行下面的push將其他下面的節點進行更新
{
lazy[point<<1]+=lazy[point];
lazy[point<<1|1]+=lazy[point];
sum[point<<1]+=lazy[point]*(len-(len>>1));
sum[point<<1|1]+=lazy[point]*(len>>1);
lazy[point]=0;//用完后取消標記
}
}
//left,r,1,n,1,up)
void update(int x,int y,int left,int right,int point,int up)
{
if(x<=left&&y>=right)
{
sum[point]+=up*(right-left+1);
lazy[point]+=up;//lazy標記改變量
return;
}
pushdown(point,right-left+1);
int mid=(left+right)/2;
if(x<=mid)
update(x,y,left,mid,point<<1,up);
if(y>mid)
update(x,y,mid+1,right,point<<1|1,up);
sum[point]=sum[point<<1]+sum[point<<1|1];
}
//left,r,1,n,1
ll query(int x,int y,int left,int r,int point)
{
//x,y是題目給定需要求的區間
//left和r是題目原有區間
if(x<=left&&y>=r)//和區間沒有交集
return sum[point];
pushdown(point,r-left+1);
int mid=(left+r)/2;
ll sum=0;
if(x<=mid)
sum=query(x,y,1,mid,point<<1);
if(y>mid)
sum+=query(x,y,mid+1,r,point<<1|1);
return sum;
}
int main()
{
ios();
cin();
cout();
int n,m;
while(cin>>n>>m)
{
mem1(sum);
mem2(lazy);
build(1,n,1);//開始建樹
//傳入左區間、右區間、根節點
while(m--)
{
string ss;
int left,r,up;
cin>>ss;
if(ss[0]=='Q')
{
cin>>left>>r;
cout<<query(left,r,1,n,1)<<endl;;
}
else if(ss[0]=='C')
{
cin>>left>>r>>up;//up是插入的數字量
update(left,r,1,n,1,up);
}
}
}
return 0;
}
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
100萬日元在日本人眼里算多嗎?很多人認為100萬日元兌換成大約是6萬元,應該不是很多錢。這只是一個完全錯誤的想法。我也是這么想的,因為日本收入高,物價低。但是,當你接觸到年輕一代的日本人,和日劇的情節進行交叉對比,你會發現,實際的100萬日元真的不是一筆小數目。首先,日本人不 他們沒有像人那樣存錢買房的習慣,所以每個月花在租房上的錢占了他們收入的很大一部分。其次,日本服務的價格都很高,每個月想省...
vivo小布同學怎么喚醒?1/4點擊小布再打開手機設置界面,然后點擊Breeno選項。2/4點擊語音在小布設置界面然后點擊Breeno語音選項。3/4你選擇沉睡在新界面再點上方語音操控選項。4/4自動打開功能在新界面再開啟語音喚醒功能,即可結束。vivo手機怎么打開語音助手?伴隨著科學技術的高速發展,我們的手機更新換代很快地,新的功能,新的使用層出不窮,有些時候一些使用技巧我們都需要慢慢慢慢才能能...
蘋果手機為新的iphone做準備怎么用?新入手的iPhone,提前開啟這四項功能,讓手機能用幾次。1.應用資源庫APP資源庫加入蘋果 s ios 14系統,可以自動整理應用和文件。綜上,桌面看起來更干凈,找應用更方便。但是很多人反映用起來不是很方便。但是現在對于app資源庫來說,加入了全新的分屏模式,查看APP資源庫方便了很多。2.聚焦模式必須開啟專注模式,這樣可以讓你更高效專注的處理一些事情。您...