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...