社区讨论
求调(9分
P1438无聊的数列参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m4881jmy
- 此快照首次捕获于
- 2024/12/03 16:52 去年
- 此快照最后确认于
- 2025/11/04 13:24 4 个月前
CPP
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
struct node{
int num,l,r,k,d;
}tr[400005];
int n,m;
int a[100005];
void pushdown(int p){
int x = tr[p * 2].r - tr[p * 2].l,y = tr[p * 2 + 1].r - tr[p * 2 + 1].l;
tr[p * 2].k = tr[p].k;
tr[p * 2 + 1].k = tr[p].k + (x + 1) * tr[p].d;
tr[p * 2].d = tr[p].d;
tr[p * 2 + 1].d = tr[p].d;
tr[p * 2].num += (x + 1) * tr[p * 2].k + (x + x * x) / 2 * tr[p * 2].d;
tr[p * 2 + 1].num += (y + 1) * tr[p * 2 + 1].k + (y + y * y) / 2 * tr[p * 2 + 1].d;
tr[p].k = 0;
tr[p].d = 0;
return ;
}
void build(int p,int l,int r){
tr[p].l = l,tr[p].r = r;
if(l == r){
tr[p].num = a[l];
return ;
}
int mid = (tr[p].l + tr[p].r) / 2;
build(p * 2,l,mid);
build(p * 2 + 1,mid + 1,r);
tr[p].num = tr[p * 2].num + tr[p * 2 + 1].num;
return ;
}
void add(int p,int l,int r,int k,int d){
if(l <= tr[p].l && tr[p].r <= r){
int n = tr[p].r - tr[p].l;
tr[p].k += k + (tr[p].l - l) * d,tr[p].d += d;
tr[p].num += (n + 1) * tr[p].k + (n + n * n) / 2 * d;
return ;
}
pushdown(p);
int mid = (tr[p].l + tr[p].r) / 2;
if(l <= mid) add(p * 2,l,r,k,d);
if(r > mid) add(p * 2 + 1,l,r,k,d);
tr[p].num = tr[p * 2].num + tr[p * 2 + 1].num;
return ;
}
int found(int p,int k){
if(tr[p].l == tr[p].r && tr[p].r == k) return tr[p].num;
pushdown(p);
int mid = (tr[p].l + tr[p].r) / 2;
if(k <= mid) return found(p * 2,k);
else return found(p * 2 + 1,k);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);
build(1,1,n);
int l,r,k,d,p,op;
for(int i = 1;i <= m;i++){
scanf("%lld",&op);
if(op == 1){
scanf("%lld%lld%lld%lld",&l,&r,&k,&d);
add(1,l,r,k,d);
}
else if(op == 2){
scanf("%lld",&p);
printf("%lld\n",found(1,p));
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...