考虑以时间为轴每个区间维护一段值,就行点修改TAT
#include <bits/stdc++.h>
using namespace std;
#define ls st<<1
#define rs st<<1|1
#define fst first
#define snd second
#define MP make_pair
#define PB push_back
#define LL long long
#define PII pair<int,int>
#define VI vector<int>
#define CLR(a,b) memset(a, (b), sizeof(a))
#define ALL(x) x.begin(),x.end()
#define rep(i,s,e) for(int i=(s); i<=(e); i++)
#define tep(i,s,e) for(int i=(s); i>=(e); i--)
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5+10;
const int mod = 1e9+7;
const double eps = 1e-8;
int arr[MAXN<<2];
int n, m;
void build(int l, int r, int st) {
arr[st] = 1;
if(l == r) return;
int mid = (l+r)>>1;
build(l,mid,ls); build(mid+1,r,rs);
}
void update(int l, int r, int st, int x, int val) {
if(l == r) {
arr[st] = val; return;
}
int mid = (l+r) >> 1;
if(x <= mid) update(l,mid,ls,x,val);
else update(mid+1,r,rs,x,val);
arr[st] = (1ll*arr[ls]*arr[rs])%m;
}
int main(int argc, char const *argv[])
{
int T;
cin >> T;
while(T--) {
cin >> n >> m;
build(1,n,1);
for(int i = 1; i <= n; i++) {
int op, x;
cin >> op >> x;
if(op == 1) update(1,n,1,i,x);
if(op == 2) update(1,n,1,x,1);
cout << arr[1] <<endl;
}
}
return 0;
}

本文介绍了一种基于线段树的数据结构实现,用于处理区间内的点更新及查询操作。通过具体的代码示例,展示了如何初始化线段树、进行点更新以及查询整个区间的值。适用于需要高效处理动态区间数据的问题。
370

被折叠的 条评论
为什么被折叠?



