結果
| 問題 |
No.1234 典型RMQ
|
| コンテスト | |
| ユーザー |
shojin_pro
|
| 提出日時 | 2020-10-12 20:48:11 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 809 ms / 2,000 ms |
| コード長 | 5,178 bytes |
| コンパイル時間 | 3,811 ms |
| コンパイル使用メモリ | 79,280 KB |
| 実行使用メモリ | 56,508 KB |
| 最終ジャッジ日時 | 2024-11-09 02:36:28 |
| 合計ジャッジ時間 | 20,809 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
FastScanner sc = new FastScanner(System.in);
PrintWriter pw = new PrintWriter(System.out);
int n = sc.nextInt();
LazySegmentTree st = new LazySegmentTree(n+1);
for(int i = 0; i < n; i++){
st.update(i,i,sc.nextLong());
}
int q = sc.nextInt();
for(int i = 0; i < q; i++){
int k = sc.nextInt();
int l = sc.nextInt()-1;
int r = sc.nextInt()-1;
long c = sc.nextLong();
if(k == 1){
st.update(l,r,c);
}else{
pw.println(st.find(l,r));
}
}
pw.flush();
}
static class GeekInteger {
public static void save_sort(int[] array) {
shuffle(array);
Arrays.sort(array);
}
public static int[] shuffle(int[] array) {
int n = array.length;
Random random = new Random();
for (int i = 0, j; i < n; i++) {
j = i + random.nextInt(n - i);
int randomElement = array[j];
array[j] = array[i];
array[i] = randomElement;
}
return array;
}
}
}
class FastScanner {
private BufferedReader reader = null;
private StringTokenizer tokenizer = null;
public FastScanner(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = null;
}
public String next() {
if (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public String nextLine() {
if (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
return reader.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken("\n");
}
public long nextLong() {
return Long.parseLong(next());
}
public int nextInt() {
return Integer.parseInt(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
public String[] nextArray(int n) {
String[] a = new String[n];
for (int i = 0; i < n; i++)
a[i] = next();
return a;
}
public int[] nextIntArray(int n) {
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = nextInt();
return a;
}
public long[] nextLongArray(int n) {
long[] a = new long[n];
for (int i = 0; i < n; i++)
a[i] = nextLong();
return a;
}
}
class LazySegmentTree{
long[] tree,lazy;
boolean[] bool;
int N;
long INF = Long.MAX_VALUE/3;
public LazySegmentTree(int n){
int now = 1;
while(now < n){
now *= 2;
}
this.N = now;
this.tree = new long[N*2];
this.lazy = new long[N*2];
this.bool = new boolean[N*2];
}
public void eval(int k, int l, int r){
//更新分が残っている場合
if(bool[k]){
//自ノードの値配列に値を伝播させる
tree[k] += lazy[k];
//子ノードの遅延配列に値を伝播させる + 最下層の時は終了する。
if(r-l > 1){
lazy[k*2+1] = lazy[k*2+2] = lazy[k];
bool[k*2+1] = bool[k*2+2] = true;
}
//更新完了したのでflgを戻す
bool[k] = false;
}
}
public void update(int a, int b, long x){
update(a,b+1,x,0,0,N);
}
public void update(int a, int b, long x, int k, int l, int r){
if(r < 0) r = N;
// k 番目のノードに対して遅延評価を行う
eval(k, l, r);
// 範囲外なら何もしない
if(b <= l || r <= a) return;
// 完全に被覆しているならば、遅延配列に値を入れた後に評価
if(a <= l && r <= b) {
lazy[k]+=x;
tree[k]+=x;
return;
}
// そうでないならば、子ノードの値を再帰的に計算して、
// 計算済みの値をもらってくる
else {
update(a, b, x, 2*k+1, l, (l+r)/2);
update(a, b, x, 2*k+2, (l+r)/2, r);
tree[k] = lazy[k] + Math.min(tree[2*k+1], tree[2*k+2]);
}
return;
}
public long find(int a, int b){
return find(a,b+1,0,0,N);
}
public long find(int a, int b, int k, int l, int r) {
if(r < 0) r = N;
eval(k, l, r);
if(b <= l || r <= a) return INF;
if(a <= l && r <= b) return tree[k];
long vl = find(a, b, 2*k+1, l, (l+r)/2);
long vr = find(a, b, 2*k+2, (l+r)/2, r);
return lazy[k] + Math.min(vl, vr);
}
}
shojin_pro