Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <math.h>
- using namespace std;
- vector<int> N;
- vector<long long> sec_sum;
- vector<long long> sec_max;
- vector<int> sec_inc;
- vector<int> sec_dec;
- int nn;
- int notperfect;
- void setupsections(){
- sec_sum.resize(nn+notperfect);
- sec_max.resize(nn+notperfect);
- sec_inc.resize(nn+notperfect);
- sec_dec.resize(nn+notperfect);
- for (int i = 0; i < sec_sum.size(); ++i)
- {
- long long sum = 0;
- long long maxx = N[i*nn];
- int inc = true;
- int dec = true;
- for (int j = i*nn; j < (i+1)*nn; ++j)
- {
- sum += N[j];
- if (maxx<N[j])
- {
- maxx = N[j];
- }
- if (j != (i+1)*nn - 1){
- if (inc && N[j] > N[j+1])
- inc = false;
- if (dec && N[j] < N[j+1])
- dec = false;
- }
- }
- sec_sum[i] = sum;
- sec_max[i] = maxx;
- sec_inc[i] = inc;
- sec_inc[i] = dec;
- int incc = inc;
- int decc = dec;
- // cout<<"i:" <<i<<" sum:" <<sum << " maxx:" <<maxx<< " inc:" <<incc << " dec:" << decc <<endl;
- }
- }
- int main(){
- int n, m;
- cin>>n>>m;
- N.resize(n);
- nn = sqrt(n);
- notperfect = sqrt(n)*sqrt(n)!=n;
- for (int i = 0; i < n; ++i)
- {
- cin>>N[i];
- }
- setupsections();
- char s;
- int x, y;
- for (int mm = 0; mm < m; ++mm)
- {
- cin>>s>>x>>y;
- x--;
- y--;
- if (s=='S')
- {
- int secx = x/nn;
- int inx = x%nn;
- int secy = y/nn;
- int iny = y%nn;
- // for (int i = 0; i < nn + notperfect; ++i)
- // {
- // cout<<sec_sum[i]<<" ";
- // }
- // cout<<endl;
- // cout<<inx<<" "<<secx<<" "<<iny<<" "<<secy<<" &&" <<endl;
- long long sum = 0;
- if (secx==secy){
- for (int i = inx; i <= iny; ++i)
- {
- sum += N[secx*nn+i];
- }
- }else{
- for (int i = inx; i < nn; ++i)
- {
- sum += N[secx*nn+i];
- }
- // cout<<sum<<endl;
- for (int i = secx+1; i < secy; ++i)
- {
- sum += sec_sum[i];
- }
- // cout<<sum<<endl;
- for (int i = 0; i <= iny; ++i)
- {
- sum += N[secy*nn + i];
- }
- }
- cout<<sum<<endl;
- }else if (s=='M'){
- int secx = x/nn;
- int inx = x%nn;
- int secy = y/nn;
- int iny = y%nn;
- int maxx = N[x];
- if (secx==secy){
- for (int i = inx; i <= iny; ++i)
- {
- if (maxx<N[secx*nn+i])
- maxx = N[secx*nn+i];
- }
- }else{
- for (int i = inx; i < nn; ++i)
- {
- if (maxx<N[secx*nn+i])
- maxx = N[secx*nn+i];
- }
- for (int i = secx+1; i < secy; ++i)
- {
- if (maxx<sec_max[i])
- maxx = sec_max[i];
- }
- for (int i = 0; i <= iny; ++i)
- {
- if (maxx<N[secy*nn+i])
- maxx = N[secy*nn + i];
- }
- }
- cout<<maxx<<endl;
- }else if (s=='I'){
- int secx = x/nn;
- int inx = x%nn;
- int secy = y/nn;
- int iny = y%nn;
- int incc = 1;
- if (secx==secy){
- for (int i = inx; i <= iny; ++i)
- {
- if (N[secx*nn+i]>N[secx*nn+i+1]){
- incc = 0;
- break;
- }
- }
- }else{
- for (int i = inx; i < nn-1; ++i)
- {
- if (N[secx*nn+i]>N[secx*nn+i+1]){
- incc = 0;
- break;
- }
- }
- for (int i = secx+1; i < secy && incc; ++i)
- {
- if (sec_inc[i]==0){
- incc= 0;
- break;
- }
- }
- for (int i = 0; i < iny && incc; ++i)
- {
- if (N[secy*nn+i] > N[secy*nn+i+1]){
- incc = 0;
- break;
- }
- }
- }
- cout<<incc<<endl;
- }else if (s=='D'){
- int secx = x/nn;
- int inx = x%nn;
- int secy = y/nn;
- int iny = y%nn;
- int decc = 1;
- if (secx==secy){
- for (int i = inx; i <= iny; ++i)
- {
- if (N[secx*nn+i]<N[secx*nn+i+1]){
- decc = 0;
- break;
- }
- }
- }
- else{
- for (int i = inx; i < nn-1; ++i)
- {
- if (N[secx*nn+i]<N[secx*nn+i+1]){
- decc = 0;
- break;
- }
- }
- for (int i = secx+1; i < secy && decc; ++i)
- {
- if (sec_inc[i]==0){
- decc= 0;
- break;
- }
- }
- for (int i = 0; i < iny && decc; ++i)
- {
- if (N[secy*nn+i] < N[secy*nn+i+1]){
- decc = 0;
- break;
- }
- }
- }
- cout<<decc<<endl;
- }else{
- y++;
- int secx = x/nn;
- int inx = x%nn;
- // cout<<sec_sum[secx]<<" "<<N[x]<<" "<<y<<" <---"<<endl;
- sec_sum[secx] = sec_sum[secx] - N[x] + y;
- N[x] = y;
- // cout<<sec_sum[secx]<<" "<<N[x]<<" "<<y<<" <---"<<endl;
- if (sec_max[secx]<y)
- sec_max[secx] = y;
- int incc = 1;
- for (int i = secx*nn; i < (secx+1)*nn - 1; ++i)
- {
- if (N[i]>N[i+1]){
- incc = 0;
- break;
- }
- }
- sec_inc[secx] = incc;
- int decc = 1;
- for (int i = secx*nn; i < (secx+1)*nn - 1; ++i)
- {
- if (N[i]<N[i+1]){
- decc = 0;
- break;
- }
- }
- sec_dec[secx] = decc;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement