下面的线段树代码经过 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;
}