Submission #1309982

#TimeUsernameProblemLanguageResultExecution timeMemory
1309982StefanSebezFire (JOI20_ho_t5)C++20
100 / 100
235 ms60612 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...