感觉复杂度也没问题啊35分
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e6+5;
const int maxn=1e3+5;
bool g[maxn][maxn];
struct edge{
int to,nxt;
}ch[maxm];
int head[maxn],cnt=1,n,m,t,v,a,b;
inline void add(int u,int v){
cnt++;
ch[cnt].nxt=head[u];
ch[cnt].to=v;
head[u]=cnt;
}
void dfs(int u,int gu){
g[gu][u]=true;
for(int i=head[u];i;i=ch[i].nxt){
int v=ch[i].to;
if(g[gu][v])continue;
dfs(v,gu);
}
}
int read(){
int x=0,z=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-')
z=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return z*x;
}
int main(){
n=read();
m=read();
t=read();
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
v=read();
add(j,v);
}
}
for(int i=1;i<=n;i++){
dfs(i,i);
}
while(t--){
a=read();
b=read();
if(g[a][b])puts("DA");
else puts("NE");
}
return 0;
}