Submission #406520

#TimeUsernameProblemLanguageResultExecution timeMemory
406520bonopo비밀 (JOI14_secret)C++14
0 / 100
880 ms15116 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define pb push_back #define el "\n" #define f first #define s second typedef long long ll; const ll MM=1e3+5, MOD=1e9+7; int N, a[MM], pfx[12][MM], sfx[12][MM]; map<pair<int,int>, int> mem; int Secret(int X, int Y); int doSecret(int X, int Y) { if(mem.find({X, Y})!=mem.end()) return mem[{X, Y}]; return mem[{X, Y}]=Secret(X, Y); } void build(int l, int r, int lvl) { int m=(l+r)/2; for(int i=l; i<=m; ++i) { int c=a[i]; for(int j=i+1; j<=m; ++j) c=doSecret(c, a[j]); sfx[lvl][i]=c; } for(int i=m+1; i<=r; ++i) { if(i==m+1) pfx[lvl][i]=a[i]; else pfx[lvl][i]=doSecret(a[i], pfx[lvl][i-1]); } if(l<r) build(l, m, lvl+1), build(m+1, r, lvl+1); } int qry(int l, int r, int ql, int qr, int lvl) { int m=(l+r)/2; if(ql<=m+1&&qr>=m) { int p=(qr==m+0?0:pfx[lvl][qr]); int s=(ql==m+1?0:sfx[lvl][ql]); if(qr==m+0) return s; if(ql==m+1) return p; return doSecret(s, p); } if(ql<=m&&qr<=m) return qry(l, m, ql, qr, lvl+1); else return qry(m+1, r, ql, qr, lvl+1); } void Init(int n, int A[]) { N=n; for(int i=0; i<N; ++i) a[i]=A[i]; build(0, N-1, 0); } int Query(int L, int R) { return qry(0, N-1, L, R, 0); }
#Verdict Execution timeMemoryGrader output
Fetching results...