[单峰数列]https://acm.hdu.edu.cn/showproblem.php?pid=7463)!

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

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N=100010;
int n,m,a[N];
struct node{
int l,r;
int add;
int ok0,ok1,ok2,ok3;//相同,升序,降序,单峰
int maxv,id;//最大值,以及下标
int v1,v2;//最左边,右边值
};
node tr[N*4];
void pushup(node &w , node &l,node &r){
if(l.ok0&&r.ok0&&l.maxv==r.maxv) //ok0
w.ok0=1;
else w.ok0=0;
if(l.ok1&&r.ok1&&l.v2<r.v1)
w.ok1=1;
else w.ok1=0;
if(l.ok2&&r.ok2&&l.v2>r.v1)
w.ok2=1;
else w.ok2=0;

if(l.maxv>=r.maxv){
w.maxv=l.maxv;
w.id=l.id;
} else{
w.maxv=r.maxv;
w.id=r.id;
}
w.v1=l.v1,w.v2=r.v2;

}
void pushup(int u) {
pushup(tr[u],tr[u*2],tr[u*2+1]);
}
void build(int u,int l,int r){
tr[u]={l,r};
if(l==r){
tr[u]={l,r,0,1,1,1,0,a[l],l,a[l],a[l]};
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);//更新父亲
}

void change(int u,int x){
tr[u].add+=x;
tr[u].maxv+=x;
tr[u].v1+=x,tr[u].v2+=x;
}
void pushdown(int u){
change(u*2,tr[u].add);
change(u*2+1,tr[u].add);
tr[u].add=0;
}
void modify(int u,int l,int r,int x){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].add+=x;
tr[u].maxv+=x;
tr[u].v1+=x,tr[u].v2+=x;
}else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)/2;
if(l<=mid) modify(u*2,l,r,x);
if(r>mid) modify(u*2+1,l,r,x);
pushup(u);
}
}
node query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r)
return tr[u];
pushdown(u);
int mid=(tr[u].l+tr[u].r)/2;
if(r<=mid) return query(u*2,l,r);
else if(l>mid) return query(u*2+1,l,r);
else{
node res,left,right;//合并
left=query(u*2,l,r);
right=query(u*2+1,l,r);
pushup(res,left,right);
return res;
}
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
build(1,1,n);
while(m--){
int ok,l,r,flag=0;
cin>>ok>>l>>r;
if(ok==1){
int x;cin>>x;
modify(1,l,r,x);
continue;
}else if(ok==2){
node res=query(1,l,r);
if(res.ok0==1) flag=1;
}else if(ok==3){
node res=query(1,l,r);
if(res.ok1==1) flag=1;
}else if(ok==4){
node res=query(1,l,r);
if(res.ok2==1) flag=1;
}else if(ok==5){
node res=query(1,l,r);
int id=res.id;
if(id!=l&&id!=r) {
node left=query(1,l,id);
node right=query(1,id+1,r);
if(left.ok1&&right.ok2)
flag=1;
}
}
cout<<flag<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
solve();
return 0;
}