| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 105717 | Pro_ktmr | Sushi (JOI16_sushi) | C++14 | 6059 ms | 82888 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include"bits/stdc++.h"
using namespace std;
int N,Q;
int X[400000];
int S[25000],T[25000],P[25000];
const int B = 633;
priority_queue<int> s[B];
priority_queue<int,vector<int>,greater<int>> memo[B];
int main(){
scanf("%d%d", &N, &Q);
for(int i=0; i<N; i++) scanf("%d",X+i);
for(int i=0; i<Q; i++){
scanf("%d%d%d", S+i, T+i, P+i);
S[i]--;
}
for(int i=0; i<N; i++) s[i/B].push(X[i]);
//
for(int q=0; q<Q; q++){
int beginB = S[q] / B;
int endB = (T[q] - 1) / B;
if(S[q] < T[q]){
while(!s[beginB].empty()) s[beginB].pop();
for(int i=beginB*B; i<(beginB+1)*B && i<N; i++){
memo[beginB].push(X[i]);
X[i] = memo[beginB].top();
memo[beginB].pop();
if(S[q] <= i && i < T[q] && X[i] > P[q]){
swap(P[q], X[i]);
}
s[beginB].push(X[i]);
}
while(!memo[beginB].empty()) memo[beginB].pop();
for(int i=beginB+1; i<endB; i++){
if(s[i].top() > P[q]){
int tmp = s[i].top();
s[i].pop();
s[i].push(P[q]);
memo[i].push(P[q]);
P[q] = tmp;
}
}
if(beginB != endB){
while(!s[endB].empty()) s[endB].pop();
for(int i=endB*B; i<(endB+1)*B && i<N; i++){
memo[endB].push(X[i]);
X[i] = memo[endB].top();
memo[endB].pop();
if(S[q] <= i && i < T[q] && X[i] > P[q]){
swap(P[q], X[i]);
}
s[endB].push(X[i]);
}
while(!memo[endB].empty()) memo[endB].pop();
}
}
else{
while(!s[beginB].empty()) s[beginB].pop();
for(int i=beginB*B; i<(beginB+1)*B && i<N; i++){
memo[beginB].push(X[i]);
X[i] = memo[beginB].top();
memo[beginB].pop();
if(S[q] <= i && X[i] > P[q]){
swap(P[q], X[i]);
}
s[beginB].push(X[i]);
}
while(!memo[beginB].empty()) memo[beginB].pop();
for(int i=beginB+1; i<=(N-1)/B; i++){
if(s[i].top() > P[q]){
int tmp = s[i].top();
s[i].pop();
s[i].push(P[q]);
memo[i].push(P[q]);
P[q] = tmp;
}
}
for(int i=0; i<endB; i++){
if(s[i].top() > P[q]){
int tmp = s[i].top();
s[i].pop();
s[i].push(P[q]);
memo[i].push(P[q]);
P[q] = tmp;
}
}
while(!s[endB].empty()) s[endB].pop();
for(int i=endB*B; i<(endB+1)*B && i<N; i++){
memo[endB].push(X[i]);
X[i] = memo[endB].top();
memo[endB].pop();
if(i < T[q] && X[i] > P[q]){
swap(P[q], X[i]);
}
s[endB].push(X[i]);
}
while(!memo[endB].empty()) memo[endB].pop();
}
printf("%d\n", P[q]);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output |
|---|---|---|---|---|
| Fetching results... | ||||
