Submission #249954

#TimeUsernameProblemLanguageResultExecution timeMemory
249954eohomegrownappsSecret (JOI14_secret)C++14
0 / 100
500 ms8904 KiB
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

int lptr[10][1000];
int rptr[10][1000];
int table[10][1000];

int n;

int findValue(int l, int r, int p){
    if (l==r){
        return table[0][l];
    }
    for (int i = p; i>=0; i--){
        if (lptr[i][l]==-1||rptr[i][r]==-1){continue;}
        if (lptr[i][l]+rptr[i][r]==(r-l+1)){
            return Secret(table[i][l],table[i][r]);
        }
    }
    assert(1==0);
}
int maxp = 0;

void Init(int N, int A[]) {
    n=N;
    for (int i = 0; i<n; i++){
        table[0][i]=A[i];
        if (i%2==0){
            lptr[0][i]=1;
            rptr[0][i]=-1;
        } else {
            lptr[0][i]=-1;
            rptr[0][i]=1;
        }
    }
    for (int p = 1; (1<<p)<=n; p++){
        int len = 1<<p;
        int cnt = 1<<p;
        bool leftp = true;
        maxp=max(maxp,p);
        for (int i = 0; i<n; i++){
            if (leftp&&cnt==0){
                cnt=1;
                leftp=false;
            } else if ((!leftp)&&cnt==len+1){
                cnt=len;
                leftp=true;
            }
            if (leftp){
                lptr[p][i]=cnt;
                rptr[p][i]=-1;
                table[p][i]=findValue(i,i+cnt-1,p-1);
                cnt--;
            } else {
                lptr[p][i]=-1;
                rptr[p][i]=cnt;
                table[p][i]=findValue(i-cnt+1,i,p-1);
                cnt++;
            }
        }
    }
}

int Query(int L, int R) {
    return findValue(L,R,maxp);
}
#Verdict Execution timeMemoryGrader output
Fetching results...