未知错误求条
查看原帖
未知错误求条
486677
Failure_Terminator楼主2023/11/5 08:41

下面的线段树代码经过 assert 证明 #8 数据中访问了负数下标,但是没查出来哪里写挂了,求指出。

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int now=0,nev=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')nev=-1;c=getchar();}
	while(c>='0'&&c<='9'){now=(now<<3)+(now<<1)+(c&15);c=getchar();}
	return now*nev;
}
void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}

const int N = 1e5 + 5;
struct Node{
	int sum = 0, rev = 0;
} t[N << 2];
int a[N], b[N], n, m;

#define ls(x) x * 2
#define rs(x) x * 2 + 1

void push_up(int x){
	t[x].sum = t[ls(x)].sum + t[rs(x)].sum;
}

void push_down(int x, int pl, int pr){
	if (t[x].rev){
		int mid = (pl + pr) >> 1, nowr = t[x].rev;
		int lenl = mid - pl + 1, lenr = pr - mid;
		t[ls(x)].rev = nowr, t[rs(x)].rev = nowr + lenl;
		t[ls(x)].sum = (nowr + (nowr + lenl - 1))
			* lenl / 2;
		t[rs(x)].sum = ((nowr + lenl) + (nowr + lenl + lenr - 1))
			* lenr / 2;
		t[x].rev = 0;
	}
}

void build(int x, int l, int r){
	if (l == r) return ;
	int mid = (l + r) >> 1;
	build(ls(x), l, mid);
	build(rs(x), mid + 1, r);
	push_up(x);
}

void update(int x, int pl, int pr, int l, int r, int ql){
	if (l <= pl && pr <= r){
		t[x].rev = ql;
		t[x].sum = (ql + (ql + pr - pl)) * (pr - pl + 1) / 2;
		return ;
	}
	push_down(x, pl, pr);
	int mid = (pl + pr) >> 1, md = ql + (mid - l);
	if (l <= mid) update(ls(x), pl, mid, l, r, ql);
	if (r > mid) update(rs(x), mid + 1, pr, l, r, md + 1);
	push_up(x);
}

int query(int x, int pl, int pr, int c){
	if (pl == pr) return t[x].sum;
	push_down(x, pl, pr);
	int mid = (pl + pr) >> 1;
	if (c <= mid) return query(ls(x), pl, mid, c);
	return query(rs(x), mid + 1, pr, c);
}

signed main()
{
	n = read(), m = read();
	for (int i = 1; i <= n; i ++) a[i] = read();
	for (int i = 1; i <= n; i ++) b[i] = read();
	build(1, 1, n);
	while (m --){
		int op = read();
		if (op == 1){
			int x, y, k, l, r;
			x = read(), l = read(), k = read();
			y = x + k - 1, r = l + k - 1;
			update(1, 1, n, l, r, x/*, y*/);
		}
		else{
			int x = read();
			int ans = query(1, 1, n, x);
			if (ans == 0) write(b[x]);
			else write(a[ans]);
			puts("");
		}
	} 
	return 0;
}
2023/11/5 08:41
加载中...