백준공부/java
[백준] 30461번 낚시 (gold 4
gomduri43
2024. 4. 8. 11:29
import java.io.*;
import java.util.*;
public class Main{
static int[][] map;
static int n;
static int m;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
n=Integer.valueOf(st.nextToken());
m=Integer.valueOf(st.nextToken());
int q=Integer.valueOf(st.nextToken());
map=new int[n+1][m+1];
for(int i=1; i<=n; i++){
st=new StringTokenizer(br.readLine());
for(int j=1; j<=m; j++){
map[i][j]=Integer.valueOf(st.nextToken());
}
}
//누적합. a,b에 미끼를 던지면 위로 쫙 걸리므로.
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
map[j][i]+=map[j-1][i];
}
}
//대각선으로 dp 대각선으로 움직이면서 끌고오므로.
//이때 누적합으로 더한 값들이 있어서 걍 대각선으로 더하기만 하면됨.
//이렇게하면 dp발생안되는 구간이 발생함.
//y축으로도 진행
for(int i=1; i<=m; i++){
dp(1,i);
}
for(int i=2; i<=n; i++){
dp(i,1);
}
StringBuilder sb=new StringBuilder("");
for(int i=0; i<q; i++){
st=new StringTokenizer(br.readLine());
int y=Integer.valueOf(st.nextToken());
int x=Integer.valueOf(st.nextToken());
sb.append(map[y][x]+"\n");
}
System.out.print(sb.toString());
}
public static void dp(int ty , int tx){
while(true){
tx+=1;
ty+=1;
if(ty>n ||tx>m){
break;
}
map[ty][tx]+=map[ty-1][tx-1];
}
}
}