#define ll long long
#define ull unsigned ll
#define pii pair<int, int>
#include <bits/stdc++.h>
using namespace std;
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}
int par(int i)
{
return i/2;
}
ll query(vector<ll>& s, int a, int b, int l, int r, int i)
{
if(l <= a && b <= r)
{
return s[i];
}
if(r < a || b < l)
{
return numeric_limits<ll>::min();
}
int m = (a+b)/2;
return max(query(s, a, m, l, r, left(i)), query(s, m+1, r, l, r, right(i)));
}
void propagate(vector<ll>& s, int i)
{
s[i] = max(s[left(i)], s[right(i)]);
if(i > 1)
{
propagate(s, par(i));
}
}
void update(vector<ll>& s, int i, ll v)
{
s[i+(s.size()/2)] = v;
propagate(s, par(i+(s.size()/2)));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
vector<ll> h(n); //heights
vector<pii> a(n); //Bereiche
for(int i = 0; i < n; i++)
{
cin>>h[i]>>a[i].first>>a[i].second;
}
int segnodes = 2*pow(2, ceil(log2(n)));
//Segtrees for max:
vector<ll> s(segnodes, numeric_limits<ll>::min()); //positive heights
vector<ll> ns(segnodes, numeric_limits<ll>::min()); //negative heights
int q;
cin>>q;
for(int i = 0; i < q; i++)
{
int l, r;
cin>>l>>r;
ll output = -1;
priority_queue<pii, vector<pii>, greater<pii>> st; //starts: distance, index
priority_queue<pii, vector<pii>, greater<pii>> g; //goals: distance, index
st.push({a[l-1].first+l, l});
g.push({a[l-1].second+l+1, l});
//cout<<"___________________________________NEW QUERY!!!"<<endl;
for(int j = l+1; j <= r; j++)
{
//cout<<"-------->: "<<j<<endl;
while(!st.empty() && st.top().first == j)
{
update(s, st.top().second-1, h[st.top().second-1]);
update(ns, st.top().second-1, 0-h[st.top().second-1]);
//cout<<"TAKE "<<st.top().second<<endl;
st.pop();
}
while(!g.empty() && g.top().first == j)
{
update(s, g.top().second-1, numeric_limits<ll>::min());
update(ns, g.top().second-1, numeric_limits<ll>::min());
//cout<<"DROP "<<g.top().second<<endl;
g.pop();
}
st.push({a[j-1].first+j, j});
g.push({a[j-1].second+j+1, j});
/*cout<<"SEGTREE S: "<<endl;
for(ll y : s)
{
cout<<y<<" ";
}
cout<<endl;*/
int left = max(j-a[j-1].second, l);
int right = max(j-a[j-1].first, l);
//cout<<"LEFT: "<<left<<", RIGHT: "<<right<<endl;
ll biggest = query(s, 1, segnodes/2, left, right, 1);
ll smallest = query(ns, 1, segnodes/2, left, right, 1);
//cout<<"BIGGEST: "<<biggest<<", SMALLEST: "<<smallest<<endl;
if(biggest > numeric_limits<ll>::min())
{
//cout<<"HEREBIG"<<endl;
output = max(output, abs(h[j-1]-biggest));
}
if(smallest > numeric_limits<ll>::min())
{
//cout<<"HERESMALL"<<endl;
output = max(output, abs(h[j-1]+smallest));
}
}
while(!g.empty())
{
update(s, g.top().second-1, numeric_limits<ll>::min());
update(ns, g.top().second-1, numeric_limits<ll>::min());
g.pop();
}
cout<<output<<"\n";
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1 ms |
468 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1 ms |
468 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
74 ms |
24968 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Runtime error |
1 ms |
468 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |