Submission #279988

#TimeUsernameProblemLanguageResultExecution timeMemory
279988MKopchevTwo Antennas (JOI19_antennas)C++14
100 / 100
1522 ms43516 KiB
#include<bits/stdc++.h>
using namespace std;
const int nmax=2e5+42,inf=1e9+42;

int n,q;

int inp[nmax];

int a[nmax],b[nmax];

vector< pair<int/*left*/,int/*id*/> > seen[nmax];

int outp[nmax];

vector<int> in[nmax],out[nmax];

int value[nmax],mx[nmax];

struct info
{
    int max_value,max_mx,max_update;
};

info actual(info ret)
{
    ret.max_mx=max(ret.max_mx,ret.max_value+ret.max_update);
    ret.max_update=-inf;
    return ret;
}
info tree[4*nmax];

void push(int node)
{
    tree[node*2].max_update=max(tree[node*2].max_update,tree[node].max_update);
    tree[node*2+1].max_update=max(tree[node*2+1].max_update,tree[node].max_update);
}

info my_merge(info le,info ri)
{
    le=actual(le);
    ri=actual(ri);

    info ret;
    ret.max_value=max(le.max_value,ri.max_value);
    ret.max_mx=max(le.max_mx,ri.max_mx);
    ret.max_update=-inf;

    return ret;
}
void update_set(int node,int l,int r,int pos,int val)
{
    if(l==r)
    {
        tree[node].max_mx=max(tree[node].max_mx,tree[node].max_value+tree[node].max_update);

        tree[node].max_value=val;

        tree[node].max_update=-inf;

        tree[node].max_mx=max(tree[node].max_mx,tree[node].max_value+tree[node].max_update);

        return;
    }

    push(node);

    int av=(l+r)/2;

    if(pos<=av)update_set(node*2,l,av,pos,val);
    else update_set(node*2+1,av+1,r,pos,val);

    tree[node]=my_merge(tree[node*2],tree[node*2+1]);
}

void update_range(int node,int l,int r,int lq,int rq,int val)
{
    if(l==lq&&r==rq)
    {
        tree[node].max_update=max(tree[node].max_update,val);

        tree[node].max_mx=max(tree[node].max_mx,tree[node].max_value+tree[node].max_update);

        return;
    }

    push(node);

    int av=(l+r)/2;

    if(lq<=av)update_range(node*2,l,av,lq,min(av,rq),val);
    if(av<rq)update_range(node*2+1,av+1,r,max(av+1,lq),rq,val);

    tree[node]=my_merge(tree[node*2],tree[node*2+1]);
}

info query(int node,int l,int r,int lq,int rq)
{
    if(l==lq&&r==rq)return actual(tree[node]);

    push(node);

    int av=(l+r)/2;

    info ret;ret.max_mx=-inf;ret.max_value=-inf;ret.max_update=-inf;

    if(lq<=av)ret=my_merge(ret,query(node*2,l,av,lq,min(av,rq)));
    if(av<rq)ret=my_merge(ret,query(node*2+1,av+1,r,max(av+1,lq),rq));

    tree[node]=my_merge(tree[node*2],tree[node*2+1]);

    return ret;
}

void solve()
{
    for(int i=1;i<=4*n;i++)
    {
        tree[i].max_value=-inf;
        tree[i].max_mx=-inf;
        tree[i].max_update=-inf;
    }

    for(int i=1;i<=n;i++)
    {
        for(auto k:in[i])
        {
            update_set(1,1,n,k,-inp[k]);
        }
        int le=max(i-b[i],1),ri=i-a[i];

        if(le<=ri)update_range(1,1,n,le,ri,inp[i]);

        for(auto k:seen[i])
        {
            outp[k.second]=max(outp[k.second],query(1,1,n,k.first,i).max_mx);
        }

        for(auto k:out[i])
        {
            update_set(1,1,n,k,-inf);
        }

    }
}

int main()
{
    memset(outp,-1,sizeof(outp));

    scanf("%i",&n);

    for(int i=1;i<=n;i++)
    {
        scanf("%i%i%i",&inp[i],&a[i],&b[i]);
        if(i+a[i]<=n)in[i+a[i]].push_back(i);
        if(i+b[i]<=n)out[i+b[i]].push_back(i);
    }
    scanf("%i",&q);

    for(int i=1;i<=q;i++)
    {
        int l,r;

        scanf("%i%i",&l,&r);

        seen[r].push_back({l,i});
    }

    solve();

    for(int i=1;i<=n;i++)inp[i]=-inp[i];

    solve();

    for(int i=1;i<=q;i++)
        printf("%i\n",outp[i]);
    return 0;
}

Compilation message (stderr)

antennas.cpp: In function 'int main()':
antennas.cpp:150:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  150 |     scanf("%i",&n);
      |     ~~~~~^~~~~~~~~
antennas.cpp:154:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  154 |         scanf("%i%i%i",&inp[i],&a[i],&b[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:158:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  158 |     scanf("%i",&q);
      |     ~~~~~^~~~~~~~~
antennas.cpp:164:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  164 |         scanf("%i%i",&l,&r);
      |         ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...