Submission #1267769

#TimeUsernameProblemLanguageResultExecution timeMemory
1267769enzyRailway Trip 2 (JOI22_ho_t4)C++20
16 / 100
2098 ms133588 KiB
#pragma GCC optimize("O3,unrool-loops")
#pragma GCC taeget("avx2")
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
const int inf=1e6+7;
const int maxk=18;
int esq[maxn][maxk], dir[maxn][maxk];
pair<int,int> seg[4*maxn][2], aux_seg[4*maxn][maxk][2];

void refresh(int id, int ini, int fim, int oq){
    if(ini!=fim){
        int e=2*id, d=2*id+1;
        if(!oq){
            seg[e][oq].second=min(seg[e][oq].second,seg[id][oq].second);
            seg[d][oq].second=min(seg[d][oq].second,seg[id][oq].second);
        }else{
            seg[e][oq].second=max(seg[e][oq].second,seg[id][oq].second);
            seg[d][oq].second=max(seg[d][oq].second,seg[id][oq].second);
        }
    }
    if(!oq){
        seg[id][oq].first=min(seg[id][oq].first,seg[id][oq].second);
        seg[id][oq].second=inf;
    }else{
        seg[id][oq].first=max(seg[id][oq].first,seg[id][oq].second);
        seg[id][oq].second=0;
    }
}


void update(int id, int ini, int fim, int l, int r, int val, int oq){
    refresh(id,ini,fim,oq);
    if(ini>r||fim<l) return;
    if(l<=ini&&fim<=r){
        if(!oq) seg[id][oq].second=min(seg[id][oq].second,val);
        else seg[id][oq].second=max(seg[id][oq].second,val);
        refresh(id,ini,fim,oq);
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    update(e,ini,mid,l,r,val,oq); update(d,mid+1,fim,l,r,val,oq);
    if(!oq) seg[id][oq].first=min(seg[e][oq].first,seg[d][oq].first);
    else seg[id][oq].first=max(seg[e][oq].first,seg[d][oq].first);
}



int query(int id, int ini, int fim, int l, int r, int oq){
    refresh(id,ini,fim,oq);
    if(ini>r||fim<l){
        if(!oq) return inf;
        else return 0;
    }
    if(l<=ini&&fim<=r) return seg[id][oq].first;
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    if(!oq) return min(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq));
    return max(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq));
}

void aux_refresh(int id, int ini, int fim, int b, int oq){
    if(ini!=fim){
        int e=2*id, d=2*id+1;
        if(!oq){
            aux_seg[e][b][oq].second=min(aux_seg[e][b][oq].second,aux_seg[id][b][oq].second);
            aux_seg[d][b][oq].second=min(aux_seg[d][b][oq].second,aux_seg[id][b][oq].second);
        }else{
            aux_seg[e][b][oq].second=max(aux_seg[e][b][oq].second,aux_seg[id][b][oq].second);
            aux_seg[d][b][oq].second=max(aux_seg[d][b][oq].second,aux_seg[id][b][oq].second);
        }
    }
    if(!oq){
        aux_seg[id][b][oq].first=min(aux_seg[id][b][oq].first,aux_seg[id][b][oq].second);
        aux_seg[id][b][oq].second=inf;
    }else{
        aux_seg[id][b][oq].first=max(aux_seg[id][b][oq].first,aux_seg[id][b][oq].second);
        aux_seg[id][b][oq].second=0;
    }
}

void aux_update(int id, int ini, int fim, int l, int r, int val, int b, int oq){
    aux_refresh(id,ini,fim,b,oq);
    if(ini>r||fim<l) return;
    if(l<=ini&&fim<=r){
        if(!oq) aux_seg[id][b][oq].second=min(aux_seg[id][b][oq].second,val);
        else aux_seg[id][b][oq].second=max(aux_seg[id][b][oq].second,val);
        aux_refresh(id,ini,fim,b,oq);
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    aux_update(e,ini,mid,l,r,val,b,oq); aux_update(d,mid+1,fim,l,r,val,b,oq);
    if(!oq) aux_seg[id][b][oq].first=min(aux_seg[e][b][oq].first,aux_seg[d][b][oq].first);
    else aux_seg[id][b][oq].first=max(aux_seg[e][b][oq].first,aux_seg[d][b][oq].first);
}

int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){
    aux_refresh(id,ini,fim,b,oq);
    if(ini>r||fim<l){
        if(!oq) return inf;
        else return 0;
    }
    if(l<=ini&&fim<=r) return aux_seg[id][b][oq].first;
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    if(!oq) return min(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq));
    return max(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq));
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int n, k, m; cin >> n >> k >> m;
    for(int i=0;i<=4*n;i++){
        for(int b=0;b<maxk;b++){
            aux_seg[i][b][0].first=aux_seg[i][b][0].second=inf;
            aux_seg[i][b][1].first=aux_seg[i][b][1].second=0;
        }
        seg[i][0].first=seg[i][0].second=inf;
        seg[i][1].first=seg[i][1].second=0;
    }
    for(int i=1;i<=n;i++){
        update(1,1,n,i,i,i,0);
        update(1,1,n,i,i,i,1);
    }
    for(int i=1;i<=m;i++){
        int a, b; cin >> a >> b;
        if(a<b) update(1,1,n,a,min(a+k-1,b),b,1);
        else{
            swap(a,b);
            update(1,1,n,max(b-k+1,a),b,a,0);
        }
    }
    for(int i=1;i<=n;i++){
        esq[i][0]=query(1,1,n,i,i,0);
        dir[i][0]=query(1,1,n,i,i,1);
        aux_update(1,1,n,i,i,esq[i][0],0,0);
        aux_update(1,1,n,i,i,dir[i][0],0,1);
    }
    for(int b=1;b<maxk;b++){
        for(int i=1;i<=n;i++){
            int l=esq[i][b-1], r=dir[i][b-1];
            esq[i][b]=aux_query(1,1,n,l,r,b-1,0);
            dir[i][b]=aux_query(1,1,n,l,r,b-1,1);
            aux_update(1,1,n,i,i,esq[i][b],b,0);
            aux_update(1,1,n,i,i,dir[i][b],b,1);
        }
    }
    int q; cin >> q;
    while(q--){
        int s, t; cin >> s >> t;
        int resp=0, l=s, r=s;
        if(esq[s][maxk-1]>t||dir[s][maxk-1]<t) cout << -1 << endl;
        else{
            for(int b=maxk-1;b>=0;b--){
                int nl=aux_query(1,1,n,l,r,b,0), nr=aux_query(1,1,n,l,r,b,1);
                if(nl>t||nr<t){
                    l=nl; r=nr;
                    resp+=(1<<b);
                }
            }
            cout << resp+1 << endl;
        }
    }
}

Compilation message (stderr)

Main.cpp:1:39: warning: bad option '-funrool-loops' to pragma 'optimize' [-Wpragmas]
    1 | #pragma GCC optimize("O3,unrool-loops")
      |                                       ^
Main.cpp:11:46: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   11 | void refresh(int id, int ini, int fim, int oq){
      |                                              ^
Main.cpp:32:68: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   32 | void update(int id, int ini, int fim, int l, int r, int val, int oq){
      |                                                                    ^
Main.cpp:49:57: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   49 | int query(int id, int ini, int fim, int l, int r, int oq){
      |                                                         ^
Main.cpp:61:57: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   61 | void aux_refresh(int id, int ini, int fim, int b, int oq){
      |                                                         ^
Main.cpp:81:79: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   81 | void aux_update(int id, int ini, int fim, int l, int r, int val, int b, int oq){
      |                                                                               ^
Main.cpp:96:68: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
   96 | int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){
      |                                                                    ^
Main.cpp:108:10: warning: bad option '-funrool-loops' to attribute 'optimize' [-Wattributes]
  108 | int main(){
      |          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...