Submission #1288374

#TimeUsernameProblemLanguageResultExecution timeMemory
1288374simona1230Two Antennas (JOI19_antennas)C++20
0 / 100
1660 ms83152 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;
    if(ql<=l&&r<=qr)
    {
        s[i].insert(h);
        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(ql<=l&&r<=qr)
    {
        s[i].erase(s[i].find(h));
        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);
    }
}

int ans=-1;

void solve(int l,int r)
{
    if(l==r)return;
    int m=(l+r)/2;

    for(int i=m+1;i<=r;i++)
        add(i);
    for(int i=l;i<=m;i++)
        ans=max(ans,query(1,1,n,i,t[i].h));
    for(int i=m+1;i<=r;i++)
        rem(i);
    solve(l,m);
    solve(m+1,r);
}

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