社区讨论
求助线段树
学术版参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lymxwkoh
- 此快照首次捕获于
- 2024/07/15 20:07 2 年前
- 此快照最后确认于
- 2024/07/15 20:57 2 年前
题目
不知道为啥数不出来
大佬帮帮我orz
(玄关)
CPP#include<bits/stdc++.h>
using namespace std;
template<typename T> void read(T&x){
int sign=1;x=0;
char c;
do{
c=getchar();
if(c=='-') sign=-1;
}while(!isdigit(c));
do{
x=x*10+c-'0';
c=getchar();
}while(isdigit(c));
x*=sign;
}
int n,m;
const int N=1e5+100;
int a[N*4],ans[N*4];
int w[N << 2],lzy[N << 2];
void build(int id,int l,int r)
{
if(l == r)
{
ans[id] = a[l];
return;
}
int mid = l + r >> 1;
// int mid = (l + r) / 2;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
//w[id] = w[id<<1]+w[id<<1|1];
}
void update(int id,int l,int r,int L,int R,int head,int cha,int k){
if(l==L&&R==r&&k<=R-L+1&&k>=0){
ans[id]+=head+cha*k;
return ;
}
int mid=(l+r)/2;
if(R<=mid) update(id*2,l,mid,L,R,head,cha,k-1);
else update(id*2+1,mid+1,r,L,R,head,cha,k-1);
}
int find (int id,int l,int r,int p){
if(l==r){
return ans[id];
}
int mid=(l+r)/2;
if(p<=mid) return find(id*2,l,mid,p);
else return find(id*2+1,mid+1,r,p);
}
int main(){
read(n); read(m);
for(int i=1;i<=n;i++){
read(a[i]);
}
while(m--){
int opt;read(opt) ;
if(opt==1){
int l;read(l);int r;read(r);int k;read(k);int d;read(d);
update(1,1,n,l,r,k,d,r-l+1);
}
else{
int p;read(p);
cout<<find(1,1,n,p)<<'\n';
}
}
return 0;
}
初学线段树就卡我一小时qwq
回复
共 2 条回复,欢迎继续交流。
正在加载回复...