Problem:
Score : 1000 points

Problem Statement

You are given a sequence a = \{a_1, ..., a_N\} with all zeros, and a sequence b = \{b_1, ..., b_N\} consisting of 0 and 1. The length of both is N.

You can perform Q kinds of operations. The i-th operation is as follows:

Replace each of a_{l_i}, a_{l_i + 1}, ..., a_{r_i} with 1.

Minimize the hamming distance between a and b, that is, the number of i such that a_i \neq b_i, by performing some of the Q operations.

Constraints

1 \leq N \leq 200,000

b consists of 0 and 1.

1 \leq Q \leq 200,000

1 \leq l_i \leq r_i \leq N

If i \neq j, either l_i \neq l_j or r_i \neq r_j.

Input

Input is given from Standard Input in the following format:

N
b_1 b_2 ... b_N
Q
l_1 r_1
l_2 r_2
:
l_Q r_Q

Output

Print the minimum possible hamming distance.

Sample Input 1

3
1 0 1
1
1 3

Sample Output 1

1

If you choose to perform the operation, a will become \{1, 1, 1\}, for a hamming distance of 1.

Sample Input 2

3
1 0 1
2
1 1
3 3

Sample Output 2

0

If both operations are performed, a will become \{1, 0, 1\}, for a hamming distance of 0.

Sample Input 3

3
1 0 1
2
1 1
2 3

Sample Output 3

1

Sample Input 4

5
0 1 0 1 0
1
1 5

Sample Output 4

2

It may be optimal to perform no operation.

Sample Input 5

9
0 1 0 1 1 1 0 1 0
3
1 4
5 8
6 7

Sample Output 5

3

Sample Input 6

15
1 1 0 0 0 0 0 0 1 0 1 1 1 0 0
9
4 10
13 14
1 7
4 14
9 11
2 6
7 8
3 12
7 13

Sample Output 6

5

Sample Input 7

10
0 0 0 1 0 0 1 1 1 0
7
1 4
2 5
1 3
6 7
9 9
1 5
7 9

Sample Output 7

1

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define MP make_pair
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define PLI pair<ll, int>
#define PIL pair<int, ll>
#define STR string
#define Fst first
#define Snd second
#define SHN 1e9
#define LSHN 1e18
using namespace std;
int val[800010][2];
bool locked[800010];
int n,m;
int a[200010];
int res;
void build(int t,int x,int y)
{
	if (x==y)
	{
		val[t][a[x]]++;
		return;
	}
	int mid=(x+y)/2;
	build(t*2+1,x,mid),build(t*2+2,mid+1,y);
	for (int i=0;i<2;i++) val[t][i]=val[t*2+1][i]+val[t*2+2][i];
}
int search(int t,int x,int y,int xi,int yi,int z)
{
	if (y<xi || yi<x || locked[t]) return 0;
	if (xi<=x && y<=yi) return val[t][z];
	int mid=(x+y)/2;
	return search(t*2+1,x,mid,xi,yi,z)+search(t*2+2,mid+1,y,xi,yi,z);
}
void lock(int t,int x,int y,int xi,int yi)
{
	if (y<xi || yi<x) return;
	if (xi<=x && y<=yi)
	{
		locked[t]=1;
		val[t][0]=val[t][1]=0;
		return;
	}
	int mid=(x+y)/2;
	lock(t*2+1,x,mid,xi,yi),lock(t*2+2,mid+1,y,xi,yi);
	for (int i=0;i<2;i++) val[t][i]=val[t*2+1][i]+val[t*2+2][i];
}
int main()
{
	scanf("%d",&n);
	for (int i=0;i<n;i++) scanf("%d",&a[i]),res+=(a[i]==0);
	build(0,0,n-1);
	scanf("%d",&m);
	for (int i=0;i<m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		x--,y--;
		if (search(0,0,n-1,x,y,1)>=search(0,0,n-1,x,y,0))
		{
			//cout <<i<<" "<<res<<" "<<search(0,0,n-1,x,y,1)<<" "<<search(0,0,n-1,x,y,0)<<" ##\n";
			res+=search(0,0,n-1,x,y,1)-search(0,0,n-1,x,y,0);
			lock(0,0,n-1,x,y);
		}
	}
	printf("%d",n-res);
	return 0;
}