제출 #72258

#제출 시각아이디문제언어결과실행 시간메모리
72258 (#118)흔한 자료구조 문제 (FXCUP3_easy)C++17
100 / 100
68 ms5164 KiB
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;

int p[100002];
int rev[100002];

int need[100002];

int tr[1 << 18]; const int O = 1 << 17;
int rs[1 << 18], re[1 << 18];

int main(){
  int N, Q; scanf("%d%d", &N, &Q);

  for(int i = 1; i <= N; i++){
    int x; scanf("%d", &x);
    p[i] = x; rev[x] = i; tr[O + i - 1] = x;
  }

  for(int i = N + 1; i <= O; i++) tr[O + i - 1] = INT_MAX;

  for(int i = 1; i <= O; i++){
    rs[O + i - 1] = i; re[O + i - 1] = i;
  }

  for(int i = O - 1; i >= 1; i--){
    tr[i] = min(tr[i * 2], tr[i * 2 + 1]);
    rs[i] = rs[i * 2];
    re[i] = re[i * 2 + 1];
  }

  for(int q = 1; q <= Q; q++){
    int M; scanf("%d", &M);

    int minIndex = N + 1, maxIndex = 0;

    for(int i = 1; i <= M; i++){
      int x; scanf("%d", &x);

      need[x] = q;

      int r = rev[x];

      if(r < minIndex) minIndex = r;
      if(r > maxIndex) maxIndex = r;
    }

    bool found = false;

    int vs = p[minIndex], ve = p[maxIndex];

    for(int i = minIndex + O - 1; !found && i > 0; i /= 2){
      if(tr[i] != vs) break;

      for(int j = maxIndex + O - 1; !found && j > 0; j /= 2){
        if(tr[j] != ve) break;

        int ss = rs[i], ee = re[j]; // 실제 쿼리
        if(ss < 1 || ee > N) continue;

        // printf("try %d %d\n", ss, ee);

        int xx = O + ss - 1, yy = O + ee - 1;
        int rem = M; bool valid = true;

        while(xx <= yy){
          if(xx & 1){
            // tr[x] 참조

            // printf("visit %d\n", tr[xx]);
            if(need[tr[xx]] != q){ valid = false; break; }
            rem--; xx++;
          }
          if(~yy & 1){
            // printf("visit %d\n", tr[yy]);
            if(need[tr[yy]] != q){ valid = false; break; }
            rem--; yy--;
          }

          xx /= 2; yy /= 2;
        }

        if(valid && rem == 0){ printf("%d %d\n", ss, ee); found = true; }
      }
    }

    if(!found) puts("-1");
  }

  for(; Q--; ){
    int M; scanf("%d", &M);
  }
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

easy.cpp: In function 'int main()':
easy.cpp:15:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int N, Q; scanf("%d%d", &N, &Q);
             ~~~~~^~~~~~~~~~~~~~~~
easy.cpp:18:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     int x; scanf("%d", &x);
            ~~~~~^~~~~~~~~~
easy.cpp:35:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     int M; scanf("%d", &M);
            ~~~~~^~~~~~~~~~
easy.cpp:40:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       int x; scanf("%d", &x);
              ~~~~~^~~~~~~~~~
easy.cpp:93:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     int M; scanf("%d", &M);
            ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...