結果
| 問題 |
No.833 かっこいい電車
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
ソースコード
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));
}
}