線段樹(單點操作)

2021-08-30 11:31:04 字數 936 閱讀 6507

單點操作

//元素

struct node tr[maxn<<2]; //節點型別

//建樹

void pushup(int m)

void build(int m, int l, int r)     //直接結束

int mid=(l+r)>>1;//求中間值

build(m<<1, l, mid);//左半邊  m*2

build(m<<1|1, mid+1, r);//右半邊  m*2+1

pushup(m);//向上更新

}//單點更新

void updata(int m, int inx, int val)

int mid=(tr[m].l+tr[m].r)>>1;//求中間值

if(inx<=mid)    //如果要找的值小於中間值,更新左半邊

updata(m<<1, inx, val);

else

updata(m<<1|1, inx, val);//更新右半邊

pushup(m);//向上更新

}//查詢

int query(int m, int l, int r)

int mid=(tr[m].l+tr[m].r)>>1;//求中間值

int temp;

if(r<=mid)//若中間值在要找區域的右邊

temp=query(m<<1, l ,r);//查詢左半部分

else if(l>mid)

temp=query(m<<1|1, l, r);

else//若mid 在所要找到範圍裡

temp=query(m<<1, l, mid)+query(m<<1|1, mid+1, r);//查詢(l,mid)和(mid,r)

return temp;

}

線段樹 (區間和 單點操作)

include include include include include include include include include include define fast ios sync with stdio false define ll long long pragma gcc o...

常用模板 線段樹單點操作

輸入 第一行兩個整數n,m,第二行n個整數表示初始時的陣列a 接下來m行,每行3個整數a,b,c,如果a 1,那麼輸出a b a c 中最大的數 若a 2,那麼將a b 改為c 輸出 每行輸出乙個整數,對應每乙個操作a 1 超級簡單的線段樹模板題,一遍就過了,子程式太多,變數更多,容易搞混很尷尬,就...

操作格仔 單點修改線段樹

問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...