Problem: 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.

Examples

Input

3
1 0 1
1
1 3


Output

1


Input

3
1 0 1
2
1 1
3 3


Output

0


Input

3
1 0 1
2
1 1
2 3


Output

1


Input

5
0 1 0 1 0
1
1 5


Output

2


Input

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


Output

3


Input

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


Output

5


Input

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


Output

1

Solution (in CPP):

Solution:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<deque>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<stdlib.h>
#include<cassert>
using namespace std;
const long long mod=1000000007;
const long long inf=mod*mod;
const long long d2=500000004;
const double EPS=1e-6;
const double PI=acos(-1.0);
int ABS(int a){return max(a,-a);}
long long ABS(long long a){return max(a,-a);}
int p[310000];
int sum[310000];
vector<pair<int,int> >g[310000];
int dp[310000];
int segtree[524288];
int query(int a,int b,int c,int d,int e){
	if(d<a||b<c)return -1;
	if(c<=a&&b<=d)return segtree[e];
	int L=query(a,(a+b)/2,c,d,e*2);
	int R=query((a+b)/2+1,b,c,d,e*2+1);
	if(L==-1)return R;
	if(R==-1)return L;
	if(dp[L]+(R-L)-(sum[R]-sum[L])<dp[R])return L;
	else return R;
}
void update(int a){
	a+=262144;
	a/=2;
	while(a){
		int L=segtree[a*2];
		int R=segtree[a*2+1];
		if(dp[L]+(R-L)-(sum[R]-sum[L])<dp[R])segtree[a]=L;
		else segtree[a]=R;
		a/=2;
	}
}
int main(){
	int a;scanf("%d",&a);
	for(int i=0;i<a;i++)scanf("%d",p+i);
	for(int i=0;i<290000;i++)sum[i+1]=sum[i]+p[i];
	int b;scanf("%d",&b);
	for(int i=0;i<262144;i++)segtree[i+262144]=i;
	for(int i=0;i<=290000;i++)dp[i]=mod;
	dp[0]=0;
	for(int i=0;i<262144;i++)update(i);

	for(int i=0;i<b;i++){
		int l,r;scanf("%d%d",&l,&r);l--;
		g[l].push_back(make_pair(r,(r-l)-(sum[r]-sum[l])));
	}
	for(int i=0;i<a;i++){
	//	printf("%d: ",i);
	//	for(int j=i;j<=a;j++)printf("%d ",dp[j]);printf("\n");
		for(int j=0;j<g[i].size();j++){
			int at=query(0,262143,i,g[i][j].first,1);
		//	printf("%d %d: %d\n",i,g[i][j].first,at);
			dp[g[i][j].first]=dp[at]+(g[i][j].first-at)-(sum[g[i][j].first]-sum[at]);
			update(g[i][j].first);
		}
		dp[i+1]=min(dp[i+1],dp[i]+p[i]);
		update(i+1);
		dp[i]=mod;
		update(i);
	}
	printf("%d\n",dp[a]);
}