luogu P2617 樹狀陣列套主席樹

2021-10-02 03:46:10 字數 1900 閱讀 5664

給定乙個含有n個數的序列a[1],a[2],a[3]……a[n],程式必須回答這樣的詢問:對於給定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的數是多少(1≤k≤j-i+1),並且,你可以改變一些a[i]的值,改變後,程式還能針對改變後的a繼續回答上面的問題。你需要編乙個這樣的程式,從輸入檔案中讀入序列a,然後讀入一系列的指令,包括詢問指令和修改指令。

對於每乙個詢問指令,你必須輸出正確的回答。

第一行有兩個正整數n(1≤n≤100000),m(1≤m≤100000)。分別表示序列的長度和指令的個數。

第二行有n個數,表示a[1],a[2]……a[n],這些數都小於10^9。接下來的m行描述每條指令,每行的格式是下面兩種格式中的一種。 q i j k 或者 c i t

q i j k (i,j,k是數字,1≤i≤j≤n, 1≤k≤j-i+1)表示詢問指令,詢問a[i],a[i+1]……a[j]中第k小的數。

c i t (1≤i≤n,0≤t≤10^9)表示把a[i]改變成為t。

對於每一次詢問,你都需要輸出他的答案,每乙個輸出佔單獨的一行。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

#include#define lowbit(x) (x&(-x))

#define mid ((l+r)>>1)

using namespace std;

const int maxn=1e5+10;

struct nodet[maxn*600];

struct quryq[maxn];

char op[10];

int n,m,ansx,ansy,tot,len;

int root[maxn*600],a[maxn],b[maxn<<1],qx[maxn],qy[maxn];

inline int read()

while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return x*f;

}inline void update(int &root,int pre,int l,int r,int val,int num)

inline void add(int pos,int v)

inline int query(int l,int r,int k,int sum=0)

else

}inline void disc()

inline void print(int x)

int main()disc();

for(int i=1;i<=n;++i) add(i,1);

for(int i=1;i<=m;++i)

else }

}

poj2155 Matrix 樹狀陣列套樹狀陣列

給定一些二維陣列中的操作形如c x1 y1 x2 y2表示把 x1,y1 到 x2,y2 中的數字0變成1,1變成0,q x y表示查詢 x,y sb題,直接二維樹狀陣列套樹狀陣列。至於0還是1的問題可以看成操作了x次就是x 2,按照類似矩陣字首和的方法更新 include include defi...

LuoguP3374 樹狀陣列1

discription 已知乙個數列,你需要進行下面兩種操作 將某乙個數加上 x 求出某區間每乙個數的和 input 1 x k 含義 將第 x 個數加上 k 2 x y 含義 輸出區間 x,y 內每個數的和 output 所有2操作的結果.solution 引入lowbit運算 例如 44 101...

luogu P3368 模板 樹狀陣列 2

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操...