Submission #1207610

#TimeUsernameProblemLanguageResultExecution timeMemory
1207610ricardsjansonsSecret (JOI14_secret)C++20
30 / 100
356 ms5252 KiB
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

const int N=1<<10;

vector<int>segt(N*2,-1);

map<pair<int,int>,int>hintmem;

int hint(int x,int y){
    if(hintmem.count({x,y})){
        return hintmem[{x,y}];
    }
    hintmem[{x,y}]=Secret(x,y);
    return hintmem[{x,y}];
}

void upd(int i,int x){
    i+=N;
    segt[i]=x;
    for(i/=2;i;i/=2){
        if(segt[i*2]<0||segt[i*2+1]<0){
            break;
        }
        segt[i]=hint(segt[i*2],segt[i*2+1]);
    }
}

void Init(int n, int a[]) {
    for(int i=0;i<n;i++){
        upd(i,a[i]);
    }
}

int hintsf(vector<int>v){
    int res=v.back();
    for(int i=v.size()-2;i>=0;i--){
        res=hint(v[i],res);
    }
    return res;
}

int hintpf(vector<int>v){
    int res=v.front();
    for(int i=1;i<v.size();i++){
        res=hint(res,v[i]);
    }
    return res;
}


int Query(int l, int r) {
    //cout<<"!"<<endl;
    l+=N;
    r+=N;
    vector<int>vl,vr;
    while(l<=r){
        if(l%2==1){
            vl.push_back(segt[l++]);
        }
        if(r%2==0){
            vr.push_back(segt[r--]);
        }
        l/=2;
        r/=2;
    }
    reverse(vr.begin(),vr.end());
    int res;
    if(vl.empty()){
        res=hintpf(vr);
    }else if(vr.empty()){
        res=hintsf(vl);
    }else{
        res=hint(hintsf(vl),hintpf(vr));
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...