[INSTRUCTIONS]

You are a program-analysis assistant. Please perform a **static** analysis of “information flow” on a given code snippet, treating each branch or loop condition as potentially taking any outcome, without using semantic or symbolic execution to prune paths.

## 1. Information Flow Definition

An **information flow** from variable `x` to variable `y`, written `x -> y`, exists whenever information stored in `x` is transferred to or used to derive information transferred to `y`. 

We denote each variable instance as `(var,lineNumber)`, meaning the variable `var` is **defined or updated** at `lineNumber`.


### Types of Direct Flows

- **Direct Explicit Flow**  
  A direct explicit flow occurs when the value written by one variable instance is directly used in computing the value of another, through operations like assignments.

  Formally, if `(varA, lineA)` writes a value and `(varB, lineB)` reads that value to compute its own, then there is a **direct explicit flow** from `(varA, lineA)` to `(varB, lineB)`, written as: `(varA,lineA) -> (varB,lineB)`. 


  **Example 1**:
    ```
    1  x = 5
    2  y = x + 1
    ```
    `(x,1) -> (y,2)` is a direct explicit flow.


  **Example 2**:
    ```
    1  x = 5
    2  if cond:
    3      y = x + 1
    ```
    `(x,1) -> (y,3)` is a direct explicit flow. 

    Under static analysis, we treat **each conditional or loop as potentially taking any outcome**, and we **do not perform semantic pruning**. Therefore, even if the statement at line 3 is conditionally executed, we still recognize `(x,1)` as used to compute `(y,3)`.
    


- **Direct Implicit Flow**

  A direct implicit flow from `(varA,lineA)` to `(varB, lineB)` occurs when `(varA,lineA)`’s value directly influences whether `lineB` executes. In other words, it corresponds to a **direct control dependence**, where the condition has **at least one branch** where `(varB, lineB)` must run and another where it may not. All conditional structures (e.g., if, while, for, switch, etc.) generate these flows.

  Formally, if `(varA,lineA)` is **directly read** in a condition at `lineC` and that condition **directly** decides whether `lineB` executes, then we say there is an **direct implicit flow** from `(varA,lineA)` to `(varB,lineB)` (or `(varA,lineA) -> (varB,lineB)`).

  **Example**:
  ```
  1  z = x + 5
  2  if z > 1:
  3      y = 10
  ```
  `(z,1) -> (z,2)* -> (y,3)` is a direct implicit flow through the condition at line 2. Line 2 is a conditional statement and the value of `(z,2)*` here is not redefined, therefore marked with "*".
  
  The asterisk * indicates that the variable is used for the conditional statement but not redefined at that line (e.g., used in a condition).



### Information Flow Between Variables

An **information flow** exists from a variable `(varA, lineA)` to another variable `(varB, lineB)` if there is a **transitive chain of direct flows** — explicit, implicit, or both — connecting them.

That is, there exists a sequence of variables:
`(varA, lineA) -> ... -> (varB, lineB)`



## 2. **Output Format**  

When asked "Which variable instances have information flow over `(targetVar, targetLine)`? List all such variables.", respond:, respond with a JSON object:

```json
   {
    "InfomationFlowSources": [
      ["valA", lineA],
      ["valB", lineB],
      ...
    ]
   }
   ```

If you believe there is no variables have information flow on `(targetVar, targetLine)`, respond:

```json
{
  "InfomationFlowSources": false
}
```


## 3. **Intraprocedural Data Dependence**  
   All dependence analysis is performed within **a single function**. We do not track dependencies across function boundaries. The analysis only applies to variables and control structures inside the **specified function**.


## 4. **Example Code Snippet**:


### Example 1
```python
1  def example_func():
2      status = 0
3      flag = False
4      balance = 1000
5      balance += 500
6      if balance > 1000:
7          status = 1
8          flag = True
9      limit = status * 5000
10     transaction = limit * 0.2
11     return flag
```

#### Example Question 1.1:
Which variable instances have information flow over `(transaction,10)`? List all such variables.


**Analysis**:
- Line 10: `(transaction,10)` reads `limit`, so there is a direct explicit flow from `(limit,9)` to `(transaction,10)`. 
- Line 9: `(limit,9)` reads `status`, so there is a direct explicit flow from `(status,7)` (or `(status,2)`) to `(limit,9)`. 
- Line 7: `(status,7)` is updated only if line 6’s condition is true, so has a direct control dependence on line 6.
- Line 6: checks `balance > 1000`, reads from `(balance,5)`, so there is a direct implicit flow from `(balance,5)` to `(status,7)` through `balance` at line 6.
- Line 5: `(balance,5)` reads from `(balance,4)`, so there is a direct explicit flow from `(balance,4)` to `(balance,5)`.
- Line 4: `(balance,4)` initializes the variable balance.
  

**Output**:
```json
   {
    "InfomationFlowSources": [
      ["limit", 9],
      ["status", 2],
      ["status", 7],
      ["balance", 4],
      ["balance", 5],
    ]
   }
```

 
#### Example Question 1.2
Which variable instances have information flow over `(flag,3)`? List all such variables.

**Analysis**
Line 3 initializes `flag` without any data dependency or control dependency. 


**Output**:
```json
{
  "InfomationFlowSources": []
}
```



### Example 2
```python
1.  val = 5
2.  size = 3
3.  arr = [0] * size
4.  i = 0
5.  j = 1
6.  total = 0
7.  if val > 2:
8.      arr[j % size] = j
9.  while i < size:
10.     arr[j] += 1
11.     score = arr[j+1]
12.     total += score * 2
13.     diff = total - score
14.     j = (j + 1) % size
15.     i += 1
16. last = arr[-1]
17. summary = diff + j
```

#### Example Question 2.1:
Which variable instances have information flow over `(summary,17)`? List all such variables.

**Output**:
```json
   {
    "InfomationFlowSources": [
      ["diff", 13],
      ["j", 14],
      ["j", 5],
      ["size", 2],
      ["i", 4],
      ["i", 15],
    ]
   }
```


**Analysis**:
- Line 17: `(summary,17)` reads `diff` and `j`. `diff` is from line 13. Next, we focus on the path through `j`. `j` is updated from line 14 and line 5. 
- Static analysis assumption: Every branch or loop condition may succeed or fail; we do not prune unreachable paths. When line 9 never evaluates to `true`, `(summary,17)` reads `j` from `(j,5)`. When line 9 evaluates to `true`, line 14 will be executed. 
- Line 14: `(j,14)` is updated inside the `while i < size` loop, so its update is control-dependent on the loop condition at line 9. There is also an explicit flow from `size` to `j`.
- Line 9: `while i < size` reads `size` (a pure read), so has a direct explicit flow from `(size,2)`. It also reads `i` from line 15 or line 4.

**Output**:
```json
   {
    "InfomationFlowSources": [
      ["diff", 13],
      ["j", 14],
      ["j", 5],
      ["size", 2],
      ["i", 4],
      ["i", 15]
    ]
   }
```


#### Example Question 2.2:
Which variable instances have information flow over `(score,11)`? List all such variables.


**Analysis**:
- Line 11: `(score,11)` reads `arr[j+1]`. There is a direct data dependence on both `arr` and `j`. That `j` may come from either `(j,5)` (initial) or subsequent updates at `(j,14)`. `arr` may come from line 3, line 8, or line 10 given the index `j+1` is with an unknown value. 
- Static analysis assumption: Every branch or loop condition may succeed or fail; we do not prune unreachable paths. Therefore, `j` could be read from either line 5 (e.g., when it is the first iteration of the while loop) or line 14 (e.g., when it is the not the first iteration of the while loop). Similar for `arr`, it could be read from line 3, line 8, or line 10.
- If `arr` is read from line 10, there is an explicit flow from `(j,5)`, `(j,14)`, and `(size,2)` to `arr`. There is also an explicit flow from `arr` itself because the operation is `+=`, hence from `(arr,3)`, `(arr,8)`, or `(arr,10)`. There is also an implicit flow from `i` and `size` to line 10. Hence from `(i, 4)`, `(i,15)`, and `(size,2)`.
- If `arr` is read from line 8, there is an explicit flow from `(j,5)` and `(size,2)` to `arr`. There is also implicit flow from `val` (as in the condition in line 7) read from line 1.
- If `arr` is read from line 3, there is an explicit flow from `(size,2)` to `arr`.
- Line 11 is control-dependent on line 9, therefore there is a implicit flow from `i` (possibly from `(i,15)` or `(i,4)`) and `size` (possibly from `(size,2)`) to line 11.

**Output**:
```json
   {
    "InfomationFlowSources": [
      ["arr", 10],
      ["arr", 8],
      ["arr", 3],
      ["j", 14],
      ["j", 5],
      ["size", 2],
      ["i", 4],
      ["i", 15],
      ["val", 1]
    ]
   }
```



#### Example Question 2.3:
Which variable instances have information flow over `(last,16)`? List all such variables.

**Analysis**:
- Line 16: `(last,16)` reads `arr[-1]`. That element may have been modified by the assignment in line 8, by the loop updates in line 10, or by initialization at line 3. Under static analysis, multiple update sites may contribute. 
- If from Line 3: there is an explicit flow from `(size,2)` to it.
- If from line 8: `arr[j % size] = j` executes only if `val > 2`, so `(arr,8)` has a direct control dependence on `(val,1)` via the `if` at line 7. There is also an explicit flow from `(j,5)` and `(size,2)` to `arr`.
- If from line 10:  there is an explicit flow from `(j,5)`, `(j,14)`, and `(size,2)` to `arr`. There is also an explicit flow from `arr` itself because the operation is `+=`, hence from `(arr,3)`, `(arr,8)`, or `(arr,10)`. There is also an implicit flow from `i` and `size` to line 10. Hence from `(i, 4)`, `(i,15)`, and `(size,2)`.


**Output**:
```json
   {
    "InfomationFlowSources": [
      ["arr", 10],
      ["arr", 8],
      ["arr", 3],
      ["j", 14],
      ["j", 5],
      ["size", 2],
      ["i", 4],
      ["i", 15],
      ["val", 1]
    ]
   }
```

---

[YOUR TURN]

Below is **your target snippet**. 

```Java
1   import java.io.IOException;
2   import java.io.InputStream;
3   import java.util.Arrays;
4   import java.util.NoSuchElementException;
5   import java.util.Random;
6   import java.util.Scanner;
7   class UnionFind{
8   	int Parent[];
9   	UnionFind(int n){
10  		Parent=new int[n];
11  		Arrays.fill(Parent, -1);
12  	}
13  	int root(int A) {
14  		if(Parent[A]<0)return A;
15  		return Parent[A]=root(Parent[A]);
16  	}
17  	int size(int A) {
18  		return -Parent[root(A)];
19  	}
20  	boolean connect(int A,int B) {
21  		A=root(A);
22  		B=root(B);
23  		if(A==B) return false;
24  		if(size(A)<size(B)) {int C=0;C=B;B=A;A=C;}
25  		Parent[A]+=Parent[B];
26  		Parent[B]=A;
27  		return true;
28  	}
29  }
30  public class Main {
31  	static FastScanner scan=new FastScanner();
32  	static Scanner scanner=new Scanner(System.in);
33  	static Random rand=new Random();
34  	static long mod=1000000007;
35  	static double eps=0.0000000001;
36  	static int big=Integer.MAX_VALUE;
37  	static long modlcm(long a,long b) {return a*b*modint(gcd(a,b),mod);}
38  	static long gcd (long a, long b) {return b>0?gcd(b,a%b):a;}
39  	static long lcm (long a, long b) {return a*b/gcd(a,b);}
40  	static int max(int a,int b) {return a>b?a:b;}
41  	static int min(int a,int b) {return a<b?a:b;}
42  	static long lmax(long a,long b) {return Math.max(a, b);}
43  	static long lmin(long a,long b) {return Math.min(a, b);}
44  	static long factorial(int i) {return i==1?1:i*factorial(i-1);}
45  	public static void main(String[] args) throws IOException {
46  		String str=scan.next();
47  		boolean b=false;
48  		for(int i=0;i<str.length();i++) {
49  			if(str.charAt(i)=='C')b=true;
50  			if(b&&str.charAt(i)=='F') {
51  				System.out.println("Yes");
52  				return;
53  			}
54  		}
55  		System.out.println("No");
56  	}
57  	static int lower_bound(int a[],int key) {
58  		int right=a.length;
59  		int left=0;
60  		while(right-left>1) {
61  			int mid=(right+left)/2;
62  			if(a[mid]<key) {
63  				left=mid;
64  			}
65  			else {
66  				right=mid;
67  			}
68  		}
69  		return left;
70  	}
71  	static int upper_bound(int a[],int key) {
72  		int right=a.length;
73  		int left=0;
74  		while(right-left>1) {
75  			int mid=(right+left)/2;
76  			if(a[mid]<=key) {
77  				left=mid;
78  			}
79  			else {
80  				right=mid;
81  			}
82  		}
83  		return left;
84  	}
85  	static boolean isPrime (long n) {
86  		if (n==2) return true;
87  		if (n<2 || n%2==0) return false;
88  		double d = Math.sqrt(n);
89  		for (int i=3; i<=d; i+=2)if(n%i==0){return false;}
90  		return true;
91  	}
92  	static int upper_division(int a,int b) {
93  		if(a%b==0) {
94  			return a/b;
95  		}
96  		else {
97  			return a/b+1;
98  		}
99  	}
100  	static long lupper_division(long a,long b) {
101  		if(a%b==0) {
102  			return a/b;
103  		}
104  		else {
105  			return a/b+1;
106  		}
107  	}
108  	static int[] setArray(int a) {
109  		int b[]=new int[a];
110  		for(int i=0;i<a;i++) {
111  			b[i]=scan.nextInt();
112  		}
113  		return b;
114  	}
115  	static long[] lsetArray(int a) {
116  		long b[]=new long[a];
117  		for(int i=0;i<a;i++) {
118  			b[i]=scan.nextLong();
119  		}
120  		return b;
121  	}
122  	static String reverce(String str) {
123  		String strr="";
124  		for(int i=str.length()-1;i>=0;i--) {
125  			strr+=str.charAt(i);
126  		}
127  		return strr;
128  	}
129  	public static void printArray(int[] que) {
130  		for(int i=0;i<que.length-1;i++) {
131  			System.out.print(que[i]+" ");
132  		}
133  		System.out.println(que[que.length-1]);
134  	}
135  	public static int[][] doublesort(int[][]a) {
136  		Arrays.sort(a,(x,y)->Integer.compare(x[0],y[0]));
137  		return a;
138  	}
139  	public static long[][] ldoublesort(long[][]a) {
140  		Arrays.sort(a,(x,y)->Long.compare(x[0],y[0]));
141  		return a;
142  	}
143  	static long modpow(long x,long n,long mo) {
144  		long sum=1;
145  		while(n>0) {
146  			if((n&1)==1) {
147  				sum=sum*x%mo;
148  			}
149  			x=x*x%mo;
150  			n>>=1;
151  		}
152  		return sum;
153  	}
154  	public static char[] revch(char ch[]) {
155  		char ret[]=new char[ch.length];
156  		for(int i=ch.length-1,j=0;i>=0;i--,j++) {
157  			ret[j]=ch[i];
158  		}
159  		return ret;
160  	}
161  	public static int[] revint(int ch[]) {
162  		int ret[]=new int[ch.length];
163  		for(int i=ch.length-1,j=0;i>=0;i--,j++) {
164  			ret[j]=ch[i];
165  		}
166  		return ret;
167  	}
168  	public static void warshall_floyd(int v[][],int n) {
169  		for(int k=0;k<n;k++)
170  			for(int i=0;i<n;i++)
171  				for(int j=0;j<n;j++)
172  					v[i][j]=min(v[i][j],v[i][k]+v[k][j]);
173  	}
174  	public static long modint(long a,long m) {
175  		long b=m,u=1,v=0;
176  		while(b!=0) {
177  			long t=a/b;
178  			a-=t*b;
179  			long x=a;
180  			a=b;
181  			b=x;
182  			u-=t*v;
183  			x=u;
184  			u=v;
185  			v=x;
186  		}
187  		u%=m;
188  		if(u<0)u+=m;
189  		return u;
190  	}
191  }
192  class FastScanner {
193  	private final InputStream in = System.in;
194  	private final byte[] buffer = new byte[1024];
195  	private int ptr = 0;
196  	private int buflen = 0;
197  	private boolean hasNextByte() {
198  		if (ptr < buflen) {
199  			return true;
200  		}else{
201  			ptr = 0;
202  			try {
203  				buflen = in.read(buffer);
204  			} catch (IOException e) {
205  				e.printStackTrace();
206  			}
207  			if (buflen <= 0) {
208  				return false;
209  			}
210  		}
211  		return true;
212  	}
213  	private int readByte() { if (hasNextByte()) return buffer[ptr++]; else return -1;}
214  	private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126;}
215  	public boolean hasNext() { while(hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++; return hasNextByte();}
216  	public String next() {
217  		if (!hasNext()) throw new NoSuchElementException();
218  		StringBuilder sb = new StringBuilder();
219  		int b = readByte();
220  		while(isPrintableChar(b)) {
221  			sb.appendCodePoint(b);
222  			b = readByte();
223  		}
224  		return sb.toString();
225  	}
226  	public long nextLong() {
227  		if (!hasNext()) throw new NoSuchElementException();
228  		long n = 0;
229  		boolean minus = false;
230  		int b = readByte();
231  		if (b == '-') {
232  			minus = true;
233  			b = readByte();
234  		}
235  		if (b < '0' || '9' < b) {
236  			throw new NumberFormatException();
237  		}
238  		while(true){
239  			if ('0' <= b && b <= '9') {
240  				n *= 10;
241  				n += b - '0';
242  			}else if(b == -1 || !isPrintableChar(b)){
243  				return minus ? -n : n;
244  			}else{
245  				throw new NumberFormatException();
246  			}
247  			b = readByte();
248  		}
249  	}
250  	public int nextInt() {
251  		long nl = nextLong();
252  		if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE) throw new NumberFormatException();
253  		return (int) nl;
254  	}
255  	public double nextDouble() { return Double.parseDouble(next());}
256  	public char nextchar() {
257  		try { return (char)System.in.read(); } catch(Exception e) {
258  			throw new RuntimeException(e);
259  		}
260  	}
261  }
```


**Question**: Which variable instances have information flow over `(n,241)` in function `nextLong`? List all such variables.

**Output**:


Ground truth answer: yes