Submission #1298109

#TimeUsernameProblemLanguageResultExecution timeMemory
1298109mohammadsamTwo Antennas (JOI19_antennas)C++20
100 / 100
464 ms51568 KiB
/*
    in the name of god
*/
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;

#define File          freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V)        V.begin(),V.end()
#define setprec(x)    fixed << setprecision(x)
#define Mp(a,b)       make_pair(a,b)
#define len(V)        (int)(V.size())
#define sep           ' '
#define endl          '\n'
#define pb            push_back
#define fi            first
#define sec           second
#define popcount(x)   __builtin_popcount(x)
#define lid           u<<1
#define rid           (lid)|1
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll N = 6e5 + 10,SQ=320,LOG=31;
const ll inf = 1e9 + 10 , MD = 1e9 + 7;

inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}
int n , q;
int arr[N];
int a[N],b[N];
vector<pii> Q[N];
int ans[N];
vector<int> L[N],R[N];
struct node{
    int ans,mn,mx,lazymn,lazymx;
    node(){}
} seg[N<<2];
node merge(const node& a,const node& b){
    node ans;
    ans.ans = max(a.ans,b.ans);
    ans.mn = min(a.mn,b.mn);
    ans.mx = max(a.mx,b.mx);
    ans.lazymn = inf;
    ans.lazymx = -inf;
    return ans;
}
void shiftmx(int u,int v){
    seg[u].lazymx = max(seg[u].lazymx,v);
    seg[u].ans = max(seg[u].ans,v - seg[u].mn);
}
void shiftmn(int u,int v){
    seg[u].lazymn = min(seg[u].lazymn,v);
    seg[u].ans = max(seg[u].ans,seg[u].mx - v);
}
void relax(int u){
    shiftmx(lid,seg[u].lazymx);
    shiftmx(rid,seg[u].lazymx);
    shiftmn(lid,seg[u].lazymn);
    shiftmn(rid,seg[u].lazymn);
    seg[u].lazymx = -inf;
    seg[u].lazymn = inf;
}
void build(int u=1,int l=1,int r=n+1){
    if(r-l==1){
        seg[u].ans = -inf;
        seg[u].mn = inf;
        seg[u].mx = -inf;
        seg[u].lazymn = inf;
        seg[u].lazymx = -inf;
        return;
    }
    int mid = (l+r)>>1;
    build(lid,l,mid);
    build(rid,mid,r);
    seg[u] = merge(seg[lid],seg[rid]);
}
void update(int s,int e,int x,int u=1,int l=1,int r=n+1){
    if(e <= s || e <= l || r <= s) return;
    if(s <= l && r <= e){
        shiftmx(u,x);
        shiftmn(u,x);
        return ;
    }
    int mid = (l+r)>>1;
    relax(u);
    update(s,e,x,lid,l,mid);
    update(s,e,x,rid,mid,r);
    seg[u] = merge(seg[lid],seg[rid]);
}
node get(int s,int e,int u=1,int l=1,int r=n+1){
    if(s <= l && r <= e){
        return seg[u];
    }
    int mid = (l+r)>>1;
    relax(u);
    if(e  <= mid) return get(s,e,lid,l,mid);
    if(s >= mid) return get(s,e,rid,mid,r);
    return merge(get(s,e,lid,l,mid),get(s,e,rid,mid,r));
}
void change(int i,int v,int u=1,int l=1,int r=n+1){
    if(r-l==1){
        if(v != -1){
            seg[u].mx = seg[u].mn = v;
        }
        else{
            seg[u].mx = -inf;
            seg[u].mn = inf;
        }
        return;
    }
    int mid = (l+r)>>1;
    relax(u);
    (i < mid ? change(i,v,lid,l,mid) : change(i,v,rid,mid,r));
    seg[u] = merge(seg[lid],seg[rid]);
}
int32_t main() {
    ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
    cin >> n ;
    for(int i =1 ;i <= n;i++){
        cin >> arr[i] >> a[i] >> b[i];
        L[i + a[i]].pb(i);
        R[i + b[i]].pb(i);
    }    
    cin >> q;
    for(int i =1 ;i <= q;i++){
        int l,r;
        cin >> l >> r;
        Q[r].pb({l,i});
    }
    fill(ans,ans+q+1,-inf);
    build();
    for(int i =1 ;i <= n;i++){
        for(auto h : L[i]){
            change(h,arr[h]);
            
        }
        int l = i - b[i];
        int r = i - a[i];
        if(r >= 1){
            // cout << "baze " << i << sep << l << sep << r << endl;
            l = max(l,1);
            update(l,r+1,arr[i]);
        }
        for(auto h : Q[i]){
            ans[h.sec] = max(ans[h.sec],get(h.fi,i+1).ans);
        }
        // cout << i << " -- " << endl;
        // for(int j = 1;j <= n;j++) cout << get(j,j+1).lazymn << sep;
        // cout << endl;
        for(auto h : R[i]){
            change(h,-1);
        }
        
    }
    for(int i = 1;i <= q;i++){
        if(ans[i] < 0){
            cout << -1 << endl;
        }
        else cout << ans[i] << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...