題目:
題目描述 description
給你n個數,有兩種操作
1:給區間[a,b]的所有數都增加x
2:詢問第i個數是什麼?
輸入描述 input description
第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數. 接下來q行每行若干個整數。如果第乙個數是1,後接3個正整數a,b,x,表示在區間[a,b]內每個數增加x,如果是2,後面跟1個整數i, 表示詢問第i個位置的數是多少。
輸出描述 output description
對於每個詢問輸出一行乙個答案
樣例輸入 sample input
31
2321 2 3 2
2 3樣例輸出 sample output
5資料範圍及提示 data size & hint
資料範圍
1<=n<=100000
1<=q<=100000
思路:區間修改 單點查詢 線段樹模板題
**:
#include #include#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
const
int inf=0x3f3f3f3f
;const
int maxn=1e5+10
;int
n,m,x,y,v,res,ans,op;
inta[maxn];
struct
nodetree[maxn
<<2
];void build(int l,int r,int
rt)
int mid=(l+r)/2
; build(l,mid,rt*2
); build(mid+1,r,rt*2+1
); tree[rt].w=tree[rt*2].w+tree[rt*2+1
].w;
}void pushdown(int
rt)void update(int
rt)
if(tree[rt].mark) pushdown(rt);
int mid=(tree[rt].l+tree[rt].r)/2
;
if(x<=mid) update(rt*2
);
if(y>mid) update(rt*2+1
); tree[rt].w=tree[rt*2].w+tree[rt*2+1
].w;
}void query(int
rt)
if(tree[rt].mark) pushdown(rt);
int mid=(tree[rt].l+tree[rt].r)/2
;
if(res<=mid) query(rt*2
);
else query(rt*2+1);}
intmain()
build(
1,n,1
); scanf("%d
",&m);
for(int i=1;i<=m;i++)
if(op==2
) }
return0;
}
Codevs 1081 線段樹練習 2
1081 線段樹練習 2 時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 傳送門題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?輸入描述 input description 第一行乙個正整數n,接下...
codevs1081 線段樹練習 2
給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是1,後接3個正整數a,b,x,表示在區間 a,b 內每個數增加x,如果是2,後面跟1個整數i,表...
線段樹模版 codevs1081線段樹練習2
題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是1,後接3個正整...