Submission #1288343

#TimeUsernameProblemLanguageResultExecution timeMemory
1288343simona1230Two Antennas (JOI19_antennas)C++20
0 / 100
779 ms589824 KiB
#include <bits/stdc++.h>

using namespace std;

struct ant
{
    long long h,a,b;
    ant() {}
    ant(long long _h,long long _a,long long _b)
    {
        h=_h;
        a=_a;
        b=_b;
    }
};

long long n;
ant t[200001];
long long q;
pair<long long,long long> p[200001];

void read()
{
    cin>>n;
    for(long long i=1; i<=n; i++)
    {
        long long x,y,z;
        cin>>x>>y>>z;
        t[i]= {x,y,z};
    }

    cin>>q;
    for(long long i=1; i<=q; i++)
    {
        cin>>p[i].first>>p[i].second;
    }
}

struct itv
{
    long long first,second,i;
    itv() {}
    itv(long long f,long long s,long long id)
    {
        first=f;
        second=s;
        i=id;
    }
};

multiset<long long> s[800001];
vector<itv> v;
long long len;

bool cmp(itv p1,itv p2)
{
    long long b1=p1.first/len;
    long long b2=p2.first/len;
    if(b1==b2)return p1.second<p2.second;
    return b1<b2;
}

long long lf,rt;

void updadd(long long i,long long l,long long r,long long ql,long long qr,long long h)
{
    if(ql>qr)return;
    s[i].insert(h);
    if(l==r)return;
    long long m=(l+r)/2;
    updadd(i*2,l,m,ql,min(qr,m),h);
    updadd(i*2+1,m+1,r,max(m+1,ql),qr,h);
}

void updrem(long long i,long long l,long long r,long long ql,long long qr,long long h)
{
    if(ql>qr)return;
    s[i].erase(s[i].find(h));
    if(l==r)return;
    long long m=(l+r)/2;
    updrem(i*2,l,m,ql,min(qr,m),h);
    updrem(i*2+1,m+1,r,max(m+1,ql),qr,h);
}


void add(long long i)
{
    long long l=max(1LL*1,i-t[i].b);
    long long r=i-t[i].a;
    if(r<0)return;

    updadd(1,1,n,l,r,t[i].h);
}

void rem(long long i)
{
    long long l=max(1LL*1,i-t[i].b);
    long long r=i-t[i].a;
    if(r<0)return;

    updrem(1,1,n,l,r,t[i].h);
}

long long query(long long i,long long l,long long r,long long id,long long h)
{
    long long ans=-1;
    if(s[i].size())
    {
        auto it=s[i].begin();
        ans=abs(h-*it);
        it=s[i].end();
        it--;
        ans=max(ans,abs(h-*it));
    }

    if(l==r)return ans;

    long long m=(l+r)/2;
    if(id<=m)return max(ans,query(i*2,l,m,id,h));
    else return max(ans,query(i*2+1,m+1,r,id,h));
}

void fixl(long long l)
{
    while(lf<l)
    {
        rem(lf);
        lf++;
    }

    while(l<lf)
    {
        lf--;
        add(lf);
    }
}

void fixr(long long r)
{
    while(r<rt)
    {
        rem(rt);
        rt--;
    }

    while(rt<r)
    {
        rt++;
        add(rt);
    }
}

void solve()
{
    len=(sqrt(n));
    for(long long i=1; i<=n; i++)
    {
        if(i+t[i].a<=n)
        {
            v.push_back({i+t[i].a,min(n,i+t[i].b),i});
        }
    }
    long long ans=-1;
    if(v.size()==0)
    {
        cout<<-1<<endl;
        exit(0);
    }

    sort(v.begin(),v.end(),cmp);

    lf=v[0].first,rt=v[0].second;
    for(long long i=lf; i<=rt; i++)
        add(i);

    ans=query(1,1,n,v[0].i,t[v[0].i].h);

    for(long long i=1;i<v.size();i++)
    {
        long long l=v[i].first;
        long long r=v[i].second;
        long long id=v[i].i;

        if(rt<l)
        {
            fixr(r);
            fixl(l);
        }
        else
        {
            fixl(l);
            fixr(r);
        }

        ans=max(ans,query(1,1,n,id,t[id].h));
    }

    cout<<ans<<endl;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    read();
    solve();
    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...