Submission #1024826

#TimeUsernameProblemLanguageResultExecution timeMemory
1024826tolbiTwo Antennas (JOI19_antennas)C++17
22 / 100
142 ms21740 KiB
#include <bits/stdc++.h> using namespace std; #define tol(bi) (1LL<<((int)(bi))) struct SegTreeMax{ vector<int> segtree; SegTreeMax(int n){ segtree.resize(tol(ceil(log2(n)+1))-1,INT_MIN); } void update(int node, int val){ node+=segtree.size()/2; segtree[node]=val; while (node){ node=(node-1)/2; segtree[node]=max(segtree[node*2+1],segtree[node*2+2]); } } int query(int tl, int tr, int l = 0, int r = -1, int node = 0){ if (r==-1) r = segtree.size()/2; if (l>=tl && r<=tr) return segtree[node]; if (l>tr || r<tl) return INT_MIN; int mid = l+(r-l)/2; int ret = INT_MIN; if (mid>=tl) ret=max(ret,query(tl,tr,l,mid,node*2+1)); if (mid<tr) ret=max(ret,query(tl,tr,mid+1,r,node*2+2)); return ret; } }; struct SegTreeMin{ vector<int> segtree; SegTreeMin(int n){ segtree.resize(tol(ceil(log2(n)+1))-1,INT_MAX); } void update(int node, int val){ node+=segtree.size()/2; segtree[node]=val; while (node){ node=(node-1)/2; segtree[node]=min(segtree[node*2+1],segtree[node*2+2]); } } int query(int tl, int tr, int l = 0, int r = -1, int node = 0){ if (r==-1) r = segtree.size()/2; if (l>=tl && r<=tr) return segtree[node]; if (l>tr || r<tl) return INT_MAX; int mid = l+(r-l)/2; int ret = INT_MAX; if (mid>=tl) ret=min(ret,query(tl,tr,l,mid,node*2+1)); if (mid<tr) ret=min(ret,query(tl,tr,mid+1,r,node*2+2)); return ret; } }; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n;cin>>n; vector<array<int,3>> arr(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < 3; ++j){ cin>>arr[i][j]; } } vector<vector<pair<int,int>>> rr(n+1); for (int i = 0; i < n-1; ++i) { rr[min(n-1,i+arr[i][1])].push_back({i,1}); rr[min(n,i+arr[i][2]+1)].push_back({i,-1}); } int q;cin>>q; SegTreeMax segtreema(n); SegTreeMin segtreemi(n); while (q--){ int l,r;cin>>l>>r; int ans = -1; for (int i = 0; i < n; i++){ for (auto it : rr[i]){ int node = it.first; if (it.second==1){ segtreema.update(node,arr[node][0]); segtreemi.update(node,arr[node][0]); } else { segtreema.update(node,INT_MIN); segtreemi.update(node,INT_MAX); } } if (i<=r-1){ int mava = segtreema.query(max(l-1,i-arr[i][2]),i-arr[i][1]); int miva = segtreemi.query(max(l-1,i-arr[i][2]),i-arr[i][1]); if (mava!=INT_MIN){ ans=max(ans,abs(mava-arr[i][0])); } if (miva!=INT_MAX){ ans=max(ans,abs(arr[i][0]-miva)); } } } cout<<ans<<endl; for (int i = 0; i < n; ++i) { segtreemi.update(i,INT_MAX); segtreema.update(i,INT_MIN); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...