1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5 #define LL(x) (x<<1)
6 #define RR(x) (x<<1|1)
7 #define MID(a,b) (a+((b-a)>>2))
8 #define INF (1<<30)
9 const int N=200005;
10 struct node
11 {
12 int lft,rht,mx,mi,sum;
13 int mid()
14 {
15 return MID(lft,rht);
16 }
17 };
18 int y[N],n,m;
19 struct Segtree
20 {
21 node tree[N*4];
22 void build(int lft,int rht,int ind )
23 {
24 tree[ind].lft=lft;
25 tree[ind].rht=rht;
26 tree[ind].mx=-INF;
27 tree[ind].mi=INF;
28 tree[ind].sum=0;
29 if(lft==rht)
30 {
31 tree[ind].mi=y[lft];
32 tree[ind].mx=y[lft];
33 tree[ind].sum=y[lft];
34 }
35 else
36 {
37 int mid=tree[ind].mid();
38 build(lft,mid,LL(ind));
39 build(mid+1,rht,RR(ind));
40 tree[ind].mx=max(tree[LL(ind)].mx,tree[RR(ind)].mx);
41 tree[ind].mi=min(tree[LL(ind)].mi,tree[RR(ind)].mi);
42 tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;
43 }
44
45
46 }
47 void updata(int pos,int ind,int valu)
48 {
49 int lft=tree[ind].lft,rht=tree[ind].rht;
50 if(lft==rht)
51 {
52 tree[ind].mx=valu;
53 tree[ind].sum=valu;
54 tree[ind].mi=valu;
55 }
56 else
57 {
58 int mid=tree[ind].mid();
59 if(pos<=mid)updata(pos,LL(ind),valu);
60 else updata(pos,RR(ind),valu);
61 tree[ind].mx=max(tree[LL(ind)].mx,tree[RR(ind)].mx);
62 tree[ind].mi=min(tree[LL(ind)].mi,tree[RR(ind)].mi);
63 tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;
64
65
66 }
67 }
68 int querymx(int st,int ed,int ind)
69 {
70 int lft=tree[ind].lft,rht=tree[ind].rht;
71 if(st<=lft&&rht<=ed)return tree[ind].mx;
72 else
73 {
74 int mid=tree[ind].mid();
75 int mx1=-INF,mx2=-INF;
76 if(st<=mid)mx1=querymx(st,ed,LL(ind));
77 if(ed>mid)mx2=querymx(st,ed,RR(ind));
78 return max(mx1,mx2);
79 }
80
81
82 }
83 int querymi(int st,int ed,int ind)
84 {
85 int lft=tree[ind].lft,rht=tree[ind].rht;
86 if(st<=lft&&rht<=ed)return tree[ind].mi;
87 else
88 {
89 int mid=tree[ind].mid();
90 int mi1=INF,mi2=INF;
91 if(st<=mid)mi1=querymi(st,ed,LL(ind));
92 if(ed>mid)mi2=querymi(st,ed,RR(ind));
93 return min(mi1,mi2);
94 }
95
96
97 }
98 int querysum(int st,int ed,int ind)
99 {
100 int lft=tree[ind].lft,rht=tree[ind].rht;
101 if(st<=lft&&rht<=ed)return tree[ind].sum;
102 else
103 {
104 int mid=tree[ind].mid();
105 int sum1=0,sum2=0;
106 if(st<=mid)sum1=querysum(st,ed,LL(ind));
107 if(ed>mid)sum2=querysum(st,ed,RR(ind));
108 return sum1+sum2;
109 }
110
111
112 }
113
114
115 } seg;
116
117
118 int main()
119 {
120
121
122 int n,m;
123 while(cin>>n>>m)
124 {
125 for(int i=1; i<=n; i++)
126 cin>>y[i];
127 seg.build(1,n,1);
128 char s;
129 int st,ed;
130 for(int i=0; i<m; i++)
131 {
132 cin>>s>>st>>ed;
133
134
135 if(s=='S')cout<<seg.querysum(st,ed,1)<<endl;
136 if(s=='A')cout<<seg.querymx(st,ed,1)<<endl;
137 if(s=='I')cout<<seg.querymi(st,ed,1)<<endl;
138
139
140 }
141
142
143 }
144
145
146 return 0;
147 }