結果

問題 No.833 かっこいい電車
ユーザー 37zigen
提出日時 2019-05-24 22:45:31
言語 Java
(openjdk 23)
結果
AC  
実行時間 1,783 ms / 2,000 ms
コード長 2,113 bytes
コンパイル時間 2,876 ms
コンパイル使用メモリ 77,956 KB
実行使用メモリ 71,936 KB
最終ジャッジ日時 2024-07-02 03:46:17
合計ジャッジ時間 32,221 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
new Main().run();
}
class SegTree {
int n;
long[] v;
public SegTree(int n_) {
n = 1;
while (n < n_)
n *= 2;
v = new long[2 * n - 1];
}
void add(int k, long val) {
k += n - 1;
v[k] += val;
while (k > 0) {
k = (k - 1) / 2;
v[k] = v[2 * k + 1] + v[2 * k + 2];
}
}
long sum(int a, int b) {
return sum(0, n, a, b, 0);
}
long sum(int l, int r, int a, int b, int k) {
if (a <= l && r <= b)
return v[k];
else if (b <= l || r <= a)
return 0;
else {
long lv = sum(l, (l + r) / 2, a, b, 2 * k + 1);
long rv = sum((l + r) / 2, r, a, b, 2 * k + 2);
return lv + rv;
}
}
}
void run() throws Exception {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int Q = sc.nextInt();
long[] A = new long[N];
for (int i = 0; i < A.length; ++i) {
A[i] = sc.nextLong();
}
SegTree seg1 = new SegTree(N);
SegTree seg2 = new SegTree(N);
for (int i = 0; i < N; ++i) {
seg1.v[i + seg1.n - 1] = A[i];
}
for (int i = seg1.n - 2; i >= 0; --i) {
seg1.v[i] = seg1.v[2 * i + 1] + seg1.v[2 * i + 2];
}
for (int i = 0; i < Q; ++i) {
int query = sc.nextInt();
int x = sc.nextInt();
--x;
if (query == 1) {
if (seg2.sum(x, x + 1) == 0) {
seg2.add(x, 1);
}
} else if (query == 2) {
if (seg2.sum(x, x + 1) == 1) {
seg2.add(x, -1);
}
} else if (query == 3) {
seg1.add(x, 1);
} else if (query == 4) {
int r_ng = N;
int r_ok = x;
while (r_ng - r_ok > 1) {
int m = (r_ng + r_ok) / 2;
if (seg2.sum(x, m) < m - x) {
r_ng = m;
} else {
r_ok = m;
}
}
int l_ok = x;// [x, x)
int l_ng = -1;
while (l_ok - l_ng > 1) {
int m = (l_ng + l_ok) / 2;
if (seg2.sum(m, x) < x - m) {
l_ng = m;
} else {
l_ok = m;
}
}
System.out.println(seg1.sum(l_ok, r_ok + 1));
}
}
}
void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0