index tree 어디서 틀렷나요?

  • sims9601
    sims9601
    #include <stdio.h>
    #include <vector>
    #include <limits.h>
    #define M 131072
    using namespace std;
    int index1[2*M+30],index2[2*M+30],s[M],n,q;
    void update1(int a,int b){
        a+=M-1;
        while(a!=0){
            if (index1[a]<b) index1[a]=b;
            else break;
            a>>=1;
        }
    }
    void update2(int a,int b){
        a+=M-1;
        while(a!=0){
            if (index2[a]>b) index2[a]=b;
            else break;
            a>>=1;
        }
    }
    int find1(int a,int b){
        a+=M-1; b+=M-1;
        int ma=0;
        while(a<=b){
            if (a==b){
                    ma=max(ma,index1[a]);
                    break;
            }
            if (a&1){
                    ma=max(ma,index1[a]);
                    a++;
            }
            if (!(b&1)){
                    ma=max(ma,index1[b]);
                    b--;
            }
            a>>=1;
            b>>=1;
        }
        return ma;
    }
    int find2(int a,int b){
        a+=M-1; b+=M-1;
        int mi=INT_MAX-1;
        while(a<=b){
                if (a==b){
                        mi=min(mi,index2[a]);
                        break;
                }
                if (a&1){
                        mi=min(mi,index2[a]);
                        a++;
                }
                if (!(b&1)){
                        mi=min(mi,index2[b]);
                        b--;
                }
                a>>=1;
                b>>=1;
        }
        return mi;
    }
    int main(){
        int test,t,i,a,b;
        scanf("%d",&test);
        for (t=1;t<=test;t++){
                scanf("%d %d",&n,&q);
                for (i=0;i<2*M+2;i++) index2[i]=INT_MAX-1;
                for (i=1;i<=n;i++){
                        scanf("%d",&s[i]);
                        update1(i,s[i]);
                        update2(i,s[i]);
                }
                for (i=1;i<=q;i++){
                        scanf("%d %d",&a,&b);
                        a++; b++;
                        printf("%d\n",find1(a,b)-find2(a,b));
                }
        }
        return 0;
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    인덱스 계산이 잘못 된 것 같은 느낌인데요. update 쪽에서 가장 마지막으로 계산되는 인덱스가 1이니 루트가 1번인데, M - 1을 더하시면 문제가 될 것 같아 보입니다.


    10년 전 link
  • Being
    Being

    그리고 다음에는 어떤 문제인지라도 간략하게 설명을 해 주시는 편이 좋겠습니다. 질문에 답변을 기다리는 것은 다른 분의 시간을 빌려 달라고 요청하는 것이기 때문에, 소스 코드만 덜렁 던져 놓으면 답변을 받을 확률이 낮아집니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.