求助:本地和洛谷在线IDE#3答案均正确但WA
查看原帖
求助:本地和洛谷在线IDE#3答案均正确但WA
500542
lvyongfeng楼主2025/8/4 19:14

P3919 【模板】可持久化线段树 1(可持久化数组)

56pts

#3

input:

4 5
-869513306 -55515509 -18235282 -850474412 
0 1 1 -371445967
1 1 4 -455963593
0 1 1 -437838418
3 1 3 -212862770
0 2 1

output:

-869513306

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct node{
	int l, r, lc, rc, v;
}tr[N << 6];
int rt[N], a[N];
int cnt, n, T;

int read(){
	char c = getchar();
	int cnt = (c == '-') ? -1 : 1;
	int res = 0;
	while(c < '0' || c > '9'){
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		res = (res << 1) + (res << 3) + (c ^ 48);
		c = getchar();
	}
	return res * cnt;
}

int addnode(int u){
	tr[++cnt] = tr[u];
	return cnt;
}

int make(int l, int r, int a[]){
	int u = ++cnt;
	tr[u].l = l;
	tr[u].r = r;
	if(l == r){
		tr[u].v = a[l];
		return u;
	}
	int mid = (l + r) >> 1;
	tr[u].lc = make(l, mid, a);
	tr[u].rc = make(mid + 1, r, a);
	return u;
}

int _update(int u, int q, int x){
	u = addnode(u);
	if(tr[u].l == tr[u].r){
		tr[u].v = x;
		return u;
	}
	int mid = (tr[u].l + tr[u].r) >> 1;
	if(mid >= q)	tr[u].lc = _update(tr[u].lc, q, x);
	else	tr[u].rc = _update(tr[u].rc, q, x);
	return u;
}

int _query(int u, int q){
	if(tr[u].l == tr[u].r){
		return tr[u].v;
	}
	int mid = (tr[u].l + tr[u].r) >> 1;
	if(mid >= q)	return _query(tr[u].lc, q);
	else	return _query(tr[u].rc, q);	
}

void build(int n, int a[]){
	rt[0] = make(1, n, a);
}

void update(int t, int bef, int q, int x){
	rt[t] = _update(rt[bef], q, x);
}

int query(int t, int bef, int q){
	rt[t] = rt[bef];
	return _query(rt[bef], q);
}

int main(){
	n = read(), T = read();
	for(int i = 1; i <= n; i++){
		a[i] = read();
	}
	build(n, a);
	for(int i = 1; i <= T; i++){
		int bef = read(), op = read(), q = read();
		if(op == 1){
			int x = read();
			update(i, bef, q, x);
		}
		if(op == 2){
			int ans = query(i, bef, q);
			printf("%d\n", ans);
		}
	}
	return 0;
}
2025/8/4 19:14
加载中...