Submission #1288355

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

using namespace std;

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

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

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

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

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

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

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

int lf,rt;

void updadd(int i,int l,int r,int ql,int qr,int h)
{
    if(ql>qr)return;
    s[i].insert(h);
    if(l==r)return;
    int 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(int i,int l,int r,int ql,int qr,int h)
{
    if(ql>qr)return;
    if(s[i].find(h)!=s[i].end())s[i].erase(s[i].find(h));
    if(l==r)return;
    int 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(int i)
{
    //cout<<"+ "<<i<<endl;
    int l=max(1,i-t[i].b);
    int r=i-t[i].a;
    if(r<0)return;

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

void rem(int i)
{
    //cout<<"- "<<i<<endl;
    int l=max(1,i-t[i].b);
    int r=i-t[i].a;
    if(r<0)return;

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

int query(int i,int l,int r,int id,int h)
{
    int 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;

    int 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(int l)
{
    while(lf<l)
    {
        rem(lf);
        lf++;
    }

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

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

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

void solve()
{
    len=(sqrt(n));
    for(int 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});
        }
    }
    int ans=-1;
    if(v.size()==0)
    {
        cout<<-1<<endl;
        exit(0);
    }
    /*v.clear();

    for(int i=1;i<=5;i++)
    {
        int x,y;
        cin>>x>>y;
        v.push_back({x,y,i});
    }*/
    sort(v.begin(),v.end(),cmp);

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

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

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

        //cout<<l<<" "<<r<<" "<<id<<endl;

        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;
}

/*

5
10 2 4
1 1 1
2 1 3
1 1 1
100 1 1
5
1 2
2 3
1 3
1 4
1 5

1 3
1 1
4 4
2 5
3 4
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...