Submission #577669

#TimeUsernameProblemLanguageResultExecution timeMemory
577669patrikpavic2Event Hopping (BOI22_events)C++17
100 / 100
1325 ms58904 KiB
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

#define PB push_back

using namespace std;

const int N = 2e5 + 500;
const int OFF = (1 << 18);
const int LOG = 20;
const int INF = 0x3f3f3f3f;

int n, q, L[N], R[N], T[LOG][2 * OFF];
int dp[LOG][N], dobar[LOG][N];
vector < int > saz;

void build(int j){
    for(int i = OFF - 1; i ; i--)
        T[j][i] = min(T[j][2 * i], T[j][2 * i + 1]);
}

int query(int j, int i, int a, int b, int lo, int hi){
    if(lo <= a && b <= hi) return T[j][i];
    if(a > hi || b < lo) return INF;
    return min(query(j, 2 * i, a, (a + b) / 2, lo, hi), query(j, 2 * i + 1, (a + b) / 2 + 1, b, lo, hi));
}

int main(){
    memset(T, INF, sizeof(T));
    scanf("%d%d", &n, &q);
    for(int i = 0;i < n;i++){
        scanf("%d%d", L + i, R + i);
        saz.PB(L[i]); saz.PB(R[i]);
        dp[0][i] = L[i];
    }
    sort(saz.begin(), saz.end());
    saz.erase(unique(saz.begin(), saz.end()), saz.end());
    for(int i = 0;i < n;i++){
        L[i] = lower_bound(saz.begin(), saz.end(), L[i]) - saz.begin();
        R[i] = lower_bound(saz.begin(), saz.end(), R[i]) - saz.begin();
        dp[0][i] = L[i];
        dobar[0][i] = 1;
        T[0][OFF + R[i]] = min(T[0][OFF + R[i]], L[i]);
    }
    build(0);
    for(int j = 1;j < LOG;j++){
        for(int i = 0;i < n;i++){
            if(!dobar[j - 1][i]){
                dp[j][i] = dp[j - 1][i];
            }
            else{
                dp[j][i] = query(j - 1, 1, 0, OFF - 1, dp[j - 1][i], R[i]);
                if(dp[j][i] < dp[j - 1][i])
                    dobar[j][i] = 1;
            }
            T[j][OFF + R[i]] = min(T[j][OFF + R[i]], dp[j][i]);
         //   printf("dp[ %d ][ %d ] = %d\n", j, i, dp[j][i]);
        }
        build(j);
    }
    for(int i = 0;i < q;i++){
        int s, t; scanf("%d%d", &s, &t);
        s--; t--;
        if(R[s] > R[t] || dp[LOG - 1][t] > R[s]){
            printf("impossible\n");
            continue;
        }
        if(s == t){
            printf("0\n");
            continue;
        }
        if(R[s] >= L[t]){
            printf("1\n");
            continue;
        }
        int odg = 0, curL = L[t];
        for(int j = LOG - 1;j >= 0;j--){
            int nw = query(j, 1, 0, OFF - 1, curL, R[t]);
            if(nw > R[s] && nw < curL){
         //       printf("uzeo j = %d\n", j);
          //      printf("prije %d sad %d\n", curL, nw);
                odg += (1 << j);
                curL = nw;
            }
        }
        printf("%d\n", odg + 2);
    }
    return 0;
}

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:32:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
events.cpp:34:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |         scanf("%d%d", L + i, R + i);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
events.cpp:64:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |         int s, t; scanf("%d%d", &s, &t);
      |                   ~~~~~^~~~~~~~~~~~~~~~
#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...