#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=2e5+50;
int n,q,a[N],Lv[N],Rv[N];
vector<array<int,3>>Qs[N];
ll res[N];
struct BIT{
ll T[2*N+50];
void Update(int i,ll x){i+=N;for(;i<=2*N;i+=i&-i)T[i]+=x;}
ll Get(int i){i+=N;ll x=0;for(;i>=1;i-=i&-i)x+=T[i];return x;}
ll Get(int l,int r){return Get(r)-Get(l-1);}
};
struct BIT1{
BIT bt,bt1;
void Update(int l,int r,ll x){
bt.Update(l,x);bt1.Update(l,x*l);
bt.Update(r+1,-x);bt1.Update(r+1,-x*(r+1));
}
ll Get(int i){return bt.Get(i)*(i+1)-bt1.Get(i);}
ll Get(int l,int r){return Get(r)-Get(l-1);}
}bt[2];
vector<array<int,3>>ev0[2*N],ev1[2*N];
void Addtriangle(int l,int r,int x){
ev0[0].pb({l,n,x});
ev0[r-l+1].pb({l,n,-x});
ev1[0].pb({r+1,n,-x});
ev1[r-l+1].pb({r+1,n,x});
}
int main(){
scanf("%i%i",&n,&q);
for(int i=1;i<=n;i++)scanf("%i",&a[i]);
for(int i=1;i<=q;i++){
int t,l,r;scanf("%i%i%i",&t,&l,&r);
Qs[t].pb({l,r,i});
}
vector<int>mono;
for(int i=1;i<=n;i++){
Rv[i]=n+1;
while(!mono.empty()&&a[mono.back()]<=a[i]){
Rv[mono.back()]=i;
mono.pop_back();
}
mono.pb(i);
}
mono.clear();
for(int i=n;i>=1;i--){
Lv[i]=-n;
while(!mono.empty()&&a[mono.back()]<a[i]){
Lv[mono.back()]=i;
mono.pop_back();
}
mono.pb(i);
}
for(int i=1;i<=n;i++){
Addtriangle(Lv[i]+1,Rv[i]-1,a[i]);
Addtriangle(Lv[i]+1,i-1,-a[i]);
Addtriangle(i+1,Rv[i]-1,-a[i]);
}
for(int t=0;t<=n;t++){
for(auto [l,r,x]:ev0[t])bt[0].Update(l,r,x);
for(auto [l,r,x]:ev1[t])bt[1].Update(l,r,x);
for(auto [l,r,i]:Qs[t])res[i]=bt[0].Get(l-t,r-t)+bt[1].Get(l,r);
}
for(int i=1;i<=q;i++)printf("%lld\n",res[i]);
return 0;
}
Compilation message (stderr)
ho_t5.cpp: In function 'int main()':
ho_t5.cpp:36:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
36 | scanf("%i%i",&n,&q);
| ~~~~~^~~~~~~~~~~~~~
ho_t5.cpp:37:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
37 | for(int i=1;i<=n;i++)scanf("%i",&a[i]);
| ~~~~~^~~~~~~~~~~~
ho_t5.cpp:39:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
39 | int t,l,r;scanf("%i%i%i",&t,&l,&r);
| ~~~~~^~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |