Submission #1182667

#TimeUsernameProblemLanguageResultExecution timeMemory
1182667user736482Fire (JOI20_ho_t5)C++20
1 / 100
1101 ms145260 KiB
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define POT (1<<20)
#define INFL 100000000099

ll n,q,t,a,b,c,k,e,m,h,w,u,pier,ost;
ll co[200007],co2[200007],ans[200007];
ll sgtree[POT][2],lazy[POT][2];
stack<pair<ll,ll>>st;//co, idx
vector<ll>v;
vector<pair<pair<ll,ll>,pair<ll,ll>>>zap;
vector<pair<pair<ll,ll>,ll>>p3;
vector<pair<pair<ll,ll>,pair<ll,ll>>>p1,p2;//kiedy,co,gdzie

void spych(ll v,ll l,ll r,ll co){
    sgtree[v*2][co]+=(r-l+1)/2*lazy[v][co];
    sgtree[v*2+1][co]+=(r-l+1)/2*lazy[v][co];
    lazy[v*2][co]+=lazy[v][co];
    lazy[v*2+1][co]+=lazy[v][co];
    lazy[v][co]=0;
}

void add(ll pocz,ll kon, ll l,ll r,ll val,ll v,ll co){
    if(pocz>r || kon<l)return;
    if(l>=pocz && kon>=r){
        sgtree[v][co]+=(r-l+1)*val;
        lazy[v][co]+=val;
    }
    else{
        spych(v,l,r,co);
        add(pocz,kon,l,(l+r)/2,val,v*2,co);
        add(pocz,kon,(l+r)/2+1,r,val,v*2+1,co);
        sgtree[v][co]=sgtree[v*2][co]+sgtree[v*2+1][co];
    }
}

ll sm(ll pocz,ll kon,ll l,ll r,ll v,ll co){
    if(pocz>r || kon<l)return 0;
    if(l>=pocz && kon>=r)return sgtree[v][co];
    else{
        spych(v,l,r,co);
     return sm(pocz,kon,l,(l+r)/2,v*2,co)+sm(pocz,kon,(l+r)/2+1,r,v*2+1,co);}
}


int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>q;
    for(ll i=0;i<n;i++){
        cin>>a;
        v.pb(a);
        while(st.size() && st.top().ff<=a){
            co[st.top().ss]=i;
            st.pop();
        }
        st.push({a,i});
    }
    while(st.size()){
        co[st.top().ss]=n;
        st.pop();
    }
    for(ll i=n-1;i>=0;i--){
        a=v[i];
        while(st.size() && st.top().ff<=a){
            co2[st.top().ss]=i;
            st.pop();
        }
        st.push({a,i});
    }
    while(st.size()){
        co2[st.top().ss]=-200002;
        st.pop();
    }
    for(ll i=0;i<n;i++){
        p3.pb({{i-1,i-co2[i]-2},-v[i]});
        p3.pb({{co[i]-1,co[i]-i-2},-v[i]});
        p3.pb({{co[i]-1,co[i]-co2[i]-2},v[i]});
    }
    for(auto i : p3){
        
        p1.pb({{0,i.ss},{0,i.ff.ff}});
        p1.pb({{i.ff.ss+1,-i.ss},{0,i.ff.ff}});
        p2.pb({{0,-i.ss},{0,i.ff.ff-1-i.ff.ss}});
        p2.pb({{i.ff.ss+1,i.ss},{0,i.ff.ff-1-i.ff.ss}});
    }
    sort(p1.begin(),p1.end());
    sort(p2.begin(),p2.end());
    reverse(p1.begin(),p1.end());
    reverse(p2.begin(),p2.end());
    for(ll i=0;i<q;i++){
        cin>>a>>b>>c;
        b--;
        c--;
        a=min(a,n-1);
        zap.pb({{a,i},{b,c}});
    }
    sort(zap.begin(),zap.end());
    
    for(auto i : zap){
        while(p1.size() && i.ff.ff>=p1.back().ff.ff){
            add(1+p1.back().ss.ff,1+p1.back().ss.ss,1,POT/2,p1.back().ff.ss,1,0);
            p1.pop_back();
        }

        while(p2.size() && i.ff.ff>=p2.back().ff.ff){

            add(1,300007+p2.back().ss.ss,1,POT/2,p2.back().ff.ss,1,1);
            p2.pop_back();
        }
        ans[i.ff.ss]=sm(1+i.ss.ff,1+i.ss.ss,1,POT/2,1,0)+sm(300007-i.ff.ff+i.ss.ff,300007-i.ff.ff+i.ss.ss,1,POT/2,1,1);
        
        
    }
    for(ll i=0;i<q;i++)cout<<ans[i]<<"\n";
}
#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...