제출 #1149392

#제출 시각아이디문제언어결과실행 시간메모리
1149392KhoaDuyTwo Antennas (JOI19_antennas)C++17
0 / 100
122 ms18992 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
pair<int,int> Tid={-1,-1};
int Uid=-1;
pair<int,int> TT(pair<int,int> &le,pair<int,int> &ri){
    pair<int,int> pa;
    pa.first=max(le.first,ri.first);
    pa.second=max(le.second,ri.second);
    return pa;
}
pair<int,int> UT(int &app,pair<int,int> &node){
    pair<int,int> pa;
    if(app==Uid){
        pa=node;
        return pa;
    }
    pa.first=node.first;
    pa.second=max(node.second,pa.first-app);
    return pa;
}
int UU(int &app,int &node){
    if(app==Uid){
        return node;
    }
    if(node==Uid){
        return app;
    }
    return min(app,node);
}
struct segtree{
    vector<pair<int,int>> seg;
    vector<int> d;
    int n,lg;
    void refresh(int v){
        seg[v]=TT(seg[v<<1],seg[(v<<1)|1]);
    }
    void build(int siz){
        n=1;
        while(n<siz){
            n<<=1;
        }
        lg=__lg(n);
        seg.assign(n<<1,Tid);
        d.assign(n,Uid);
        for(int i=n-1;i>=1;i--){
            refresh(i);
        }
    }
    void apply(int v,int &f){
        seg[v]=UT(f,seg[v]);
        if(v<n){
            d[v]=UU(f,d[v]);
        }
    }
    void push(int v){
        apply(v<<1,d[v]);
        apply((v<<1)|1,d[v]);
        d[v]=Uid;
    }
    void update1(int l,int x){
        l+=n;
        for(int i=lg;i>=1;i--){
            push(l>>i);
        }
        seg[l].first=x;
        for(int i=1;i<=lg;i++){
            refresh(l>>i);
        }
    }
    void update2(int l,int r,int &f){
        l+=n,r+=n;
        if(l>=r){
            return;
        }
        for(int i=lg;i>=1;i--){
            if((l>>i<<i)!=l){
                push(l>>i);
            }
            if((r>>i<<i)!=r){
                push(r>>i);
            }
        }
        int l0=l,r0=r;
        for(;l<r;l>>=1,r>>=1){
            if(l&1){
                apply(l,f);
                l++;
            }
            if(r&1){
                r--;
                apply(r,f);
            }
        }
        l=l0,r=r0;
        for(int i=1;i<=lg;i++){
            if((l>>i<<i)!=l){
                refresh(l>>i);
            }
            if((r>>i<<i)!=r){
                refresh(r>>i);
            }
        }
    }
    pair<int,int> query(int l,int r){
        l+=n,r+=n;
        if(l>=r){
            return Tid;
        }
        for(int i=lg;i>=1;i--){
            if((l>>i<<i)!=l){
                push(l>>i);
            }
            if((r>>i<<i)!=r){
                push(r>>i);
            }
        }
        pair<int,int> curr=Tid;
        for(;l<r;l>>=1,r>>=1){
            if(l&1){
                curr=TT(curr,seg[l]);
                l++;
            }
            if(r&1){
                r--;
                curr=TT(curr,seg[r]);
            }
        }
        return curr;
    }
};
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    vector<int> h(n),a(n),b(n);
    for(int i=0;i<n;i++){
        cin >> h[i] >> a[i] >> b[i];
    }
    int q;
    cin >> q;
    int ans[q];
    memset(ans,-1,sizeof(ans));
    int l[q],r[q];
    for(int i=0;i<q;i++){
        cin >> l[i] >> r[i];
        l[i]--,r[i]--;
    }
    for(int phase=0;phase<2;phase++){
        if(phase==1){
            cout << ans[0] << endl;
            exit(0);
        }
        vector<vector<pair<int,int>>> que(n);
        vector<vector<pair<int,int>>> group(n);
        for(int i=0;i<q;i++){
            que[r[i]].push_back({l[i],i});
        }
        for(int i=0;i<n;i++){
            if(i+a[i]<n){
                group[i+a[i]].push_back({i,1});
                if(i+b[i]+1<n){
                    group[i+b[i]+1].push_back({i,-1});
                }
            }
        }
        segtree seg;
        seg.build(n);
        for(int r=0;r<n;r++){
            for(pair<int,int> &x:group[r]){
                if(x.second==1){
                    //cout << "UPD1 " << x.first << ' ' << h[x.first] << endl;
                    seg.update1(x.first,h[x.first]);
                }
                else{
                    //cout << "UPD1 " << x.first << ' ' << -1 << endl;
                    seg.update1(x.first,-1);
                }
            }
            if(r-a[r]>=0){
                //cout << "UPD2 " << max(r-b[r],0) << ' ' << r-a[r] << ' ' << h[r] << endl;
                seg.update2(max(r-b[r],0),r-a[r]+1,h[r]);
            }
            for(pair<int,int> &x:que[r]){
                //cout << "QUERY " << x.first << ' ' << r << endl;
                ans[x.second]=max(ans[x.second],seg.query(x.first,r+1).second);
            }
        }
        reverse(h.begin(),h.end());
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        for(int i=0;i<q;i++){
            l[i]=n-1-l[i],r[i]=n-1-r[i];
            swap(l[i],r[i]);
        }
    }
    for(int i=0;i<q;i++){
        cout << ans[i] << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...