Submission #1170079

#TimeUsernameProblemLanguageResultExecution timeMemory
1170079Szymon_PilipczukTwo Antennas (JOI19_antennas)C++20
0 / 100
2 ms1344 KiB
#include <bits/stdc++.h>
using namespace std;
int h[2000];
int a[2000];
int b[2000];
int tr[2][2000][4000];
int n;
void add(int t1,int t,int p,int v)
{
    p+=n;
    tr[t1][t][p] = max(tr[t1][t][p],v);
    p/=2;
    while(p > 0)
    {
        tr[t1][t][p] = max(tr[t1][t][p*2],tr[t1][t][p*2+1]);
        p/=2;
    }
}
int check(int t1,int t,int l,int r)
{
    l+=n;
    r+=n;
    int ans = max(tr[t1][t][l],tr[t1][t][r]);
    while(l/2 != r/2)
    {
        if(l%2 == 0) ans = max(ans,tr[t1][t][l+1]);
        if(r%2 == 1) ans = max(ans,tr[t1][t][r-1]);
        l/=2;r/=2;
    }
    return ans;
}
int main()
{
    cin>>n;
    for(int i =0 ;i<n;i++)
    {
        cin>>h[i];
        cin>>a[i];
        cin>>b[i];
    }
    for(int i =0 ;i<n;i++)
    {
        for(int j =0 ;j<n*2;j++)
        {
            tr[0][i][j] = -1;
            tr[1][i][j] = -1;
        }
    }
    for(int i = 0;i<n;i++)
    {
        int mx = -1;
        for(int j= i-1;j>=0;j--)
        {
            if(j + a[j] <= i && i<= j+ b[j] && i-a[i] >= j && j >= i-b[i])
            {
                mx = max(mx,abs(h[i]-h[j]));
            }
            add(0,j,i,mx);
        }
        int mx2 = -1;
        for(int j = i+1;j<n;j++)
        {
            if(i + a[i] <= j && j<= i + b[i] && j-a[j] >=  i&& i >= j-b[j])
            {
                mx2 = max(mx2,abs(h[i]-h[j]));
            }
            add(1,j,i,mx);
        }
    }
    int q;
    cin>>q;
    for(int i =0 ;i<q;i++)
    {
        int l,r;
        cin>>l>>r;
        l--;r--;
        cout<<max(check(0,l,l,r),check(1,r,l,r))<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...