/
2149.cpp
155 lines (144 loc) · 3.44 KB
/
2149.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <bits/stdc++.h>
#define MAXN 100010
using namespace std;
struct SegmentTree
{
int p,r,m;bool se;
long long x,b,mn,s;
};
SegmentTree tree[1<<18];
int n,T,o,l,r;
long long a[MAXN],b[MAXN],s[MAXN];
void BuildTree(int u)
{
if (tree[u].p+1==tree[u].r)
{
tree[u].x=a[tree[u].p]-b[tree[u].p];
tree[u].mn=tree[u].x;
tree[u].b=b[tree[u].p];
return ;
}
tree[u].m=tree[u].p+tree[u].r>>1;
tree[u<<1].p=tree[u].p;tree[u<<1].r=tree[u].m;BuildTree(u<<1);
tree[u<<1|1].p=tree[u].m;tree[u<<1|1].r=tree[u].r;BuildTree(u<<1|1);
tree[u].mn=min(tree[u<<1].mn,tree[u<<1|1].mn);
tree[u].x=tree[u<<1].x+tree[u<<1|1].x;
tree[u].b=tree[u<<1].b+tree[u<<1|1].b;
return ;
}
inline void Pushdown(int u)
{
if (!tree[u].se) return ;
tree[u<<1].x=(tree[u<<1].r-tree[u<<1].p)*tree[u].s;
tree[u<<1].mn=tree[u].s;
tree[u<<1].se=true;tree[u<<1].s=tree[u].s;
tree[u<<1|1].x=(tree[u<<1|1].r-tree[u<<1|1].p)*tree[u].s;
tree[u<<1|1].mn=tree[u].s;
tree[u<<1|1].se=true;tree[u<<1|1].s=tree[u].s;
tree[u].se=false;
return ;
}
void modify(int u,int l,int r,long long v)
{
if (tree[u].p==l&&tree[u].r==r)
{
tree[u].s=v;
tree[u].x=(r-l)*v;tree[u].mn=v;
tree[u].se=true;
return ;
}
Pushdown(u);
if (r<=tree[u].m) modify(u<<1,l,r,v);
else if (tree[u].m<=l) modify(u<<1|1,l,r,v);
else
{
modify(u<<1,l,tree[u].m,v);
modify(u<<1|1,tree[u].m,r,v);
}
tree[u].mn=min(tree[u<<1].mn,tree[u<<1|1].mn);
tree[u].x=tree[u<<1].x+tree[u<<1|1].x;
return ;
}
inline long long modify_one(int u,int x,long long v)
{
if (tree[u].p+1==tree[u].r)
{
tree[u].x+=v;tree[u].mn+=v;return tree[u].x;
}
Pushdown(u);
long long p;
if (x<tree[u].m) p=modify_one(u<<1,x,v);
else p=modify_one(u<<1|1,x,v);
tree[u].mn=min(tree[u<<1].mn,tree[u<<1|1].mn);
tree[u].x=tree[u<<1].x+tree[u<<1|1].x;
return p;
}
inline int qmin(int u,int l,int r,long long x)
{
if (tree[u].p+1==tree[u].r) return tree[u].x<x?l:-1;
Pushdown(u);
if (tree[u].mn>=x) return -1;
if (r<=tree[u].m) return qmin(u<<1,l,r,x);
else if (tree[u].m<=l) return qmin(u<<1|1,l,r,x);
else
{
int t=qmin(u<<1|1,tree[u].m,r,x);
if (~t) return t;
else return qmin(u<<1,l,tree[u].m,x);
}
}
inline pair<long long,long long> query(int u,int l,int r)
{
if (tree[u].p==l&&tree[u].r==r) return make_pair(tree[u].x,tree[u].b);
Pushdown(u);
if (r<=tree[u].m) return query(u<<1,l,r);
else if (tree[u].m<=l) return query(u<<1|1,l,r);
else
{
pair<long long,long long> ll,rr;
ll=query(u<<1,l,tree[u].m);
rr=query(u<<1|1,tree[u].m,r);
return make_pair(ll.first+rr.first,ll.second+rr.second);
}
}
inline void read(int &x)
{
x=0;char ch=getchar();bool f=false;
while (ch<'0'||ch>'9'){if (ch=='-') f=true;ch=getchar();}
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
if (f) x=-x;return ;
}
inline void read(long long &x)
{
x=0LL;char ch=getchar();bool f=false;
while (ch<'0'||ch>'9'){if (ch=='-') f=true;ch=getchar();}
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
if (f) x=-x;return ;
}
int main()
{
read(n);
for (int i=1;i<=n;i++) read(a[i]);
for (int i=1;i<n;i++) read(b[i]);
for (int i=1;i<n;i++) b[i]+=b[i-1];
for (int i=n;i;i--) b[i]=b[i-1];
tree[1].p=1;tree[1].r=n+1;BuildTree(1);
read(T);
while (T--)
{
read(o);read(l);read(r);--o;
if (o)
{
pair<long long,long long> res=query(1,l,r+1);
printf("%lld\n",res.first+res.second);
}
else
{
long long x=modify_one(1,l,r);
int p=qmin(1,l,n+1,x);
if (!~p) continue;
if (l!=p&&l<n) modify(1,l+1,p+1,x);
}
}
return 0;
}