/* Headers */
#include <unordered_map>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <climits>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#define FOR(i,a,b,c) for(int i=(a);i<=(b);i+=(c))
#define ROF(i,a,b,c) for(int i=(a);i>=(b);i-=(c))
#define FORL(i,a,b,c) for(long long i=(a);i<=(b);i+=(c))
#define ROFL(i,a,b,c) for(long long i=(a);i>=(b);i-=(c))
#define FORR(i,a,b,c) for(register int i=(a);i<=(b);i+=(c))
#define ROFR(i,a,b,c) for(register int i=(a);i>=(b);i-=(c))
#define RevEdge(x) x^1
#define lowbit(x) x&(-x)
#define LeftChild(x) x<<1
#define RightChild(x) (x<<1)+1
#define CLOSE_IN() fclose(stdin);
#define CLOSE_OUT() fclose(stdout);
#define FILE_IN(x) freopen(x,"r",stdin);
#define FILE_OUT(x) freopen(x,"w",stdout);
#define IOS(x) std::ios::sync_with_stdio(x)
#define Dividing() printf("-----------------------------------\n");
namespace FastIO {
#define gc() (iS == iT ? (iT = (iS = ibuff) + fread(ibuff, 1, SIZ, stdin), (iS == iT ? EOF : *iS++)) : *iS++)
    const int SIZ = 1 << 21 | 1;
    char* iS, * iT, ibuff[SIZ], obuff[SIZ], * oS = obuff, * oT = oS + SIZ - 1, fu[110], cc;
    int fr;
    inline void out() {
        fwrite(obuff, 1, oS - obuff, stdout);
        oS = obuff;
    }
    template<class Type>
    inline void read(Type& x) {
        x = 0;
        Type y = 1;
        for (cc = gc(); (cc > '9' || cc < '0') && cc != '-'; cc = gc());
        cc == '-' ? y = -1 : x = (cc & 15);
        for (cc = gc(); cc >= '0' && cc <= '9'; cc = gc())
            x = x * 10 + (cc & 15);
        x *= y;
    }
    template<class Type>
    inline void print(Type x, char text = '\n') {
        if (x < 0)
            * oS++ = '-', x *= -1;
        if (x == 0)
            * oS++ = '0';
        while (x)
            fu[++fr] = x % 10 + '0', x /= 10;
        while (fr);
            * oS++ = fu[fr--];
        * oS++ = text;
        out();
    }
    inline void prints(char x[], char text = '\n') {
        for (register int i = 0; x[i]; ++i)
            * oS++ = x[i];
        * oS++ = text;
        out();
    }
}
using namespace FastIO;
template<typename T>
inline T max(T a, T b) {return (a > b) ? a : b;}
template<typename T>
inline T min(T a, T b) {return (a > b) ? b : a;}
/* definitions */
const int MAXN = 2e5 + 10;
int n, q, cnt, ans, a[MAXN], pre[MAXN][2];
std::vector<int> S[MAXN];
struct Tree {int minx, tag;} SMT[MAXN << 2];
/* functions */
inline void pushUp(int k) {
	SMT[k].minx = min(SMT[LeftChild(k)].minx, SMT[RightChild(k)].minx);
}
inline void pushDown(int k) {
	SMT[LeftChild(k)].tag += SMT[k].tag;
	SMT[RightChild(k)].tag += SMT[k].tag;
	SMT[LeftChild(k)].minx += SMT[k].tag;
	SMT[RightChild(k)].minx += SMT[k].tag;
	SMT[k].tag = 0; 
}
inline void Insert(int k, int l, int r, int pos, int val) {
	if(l == pos && r == pos) {
		SMT[k].minx = min(SMT[k].minx, val);
		return ; 
	} int mid = (l + r) >> 1;
	if(SMT[k].tag) pushDown(k);
	if(pos <= mid) Insert(LeftChild(k), l, mid, pos, val);
	else Insert(RightChild(k), mid + 1, r, pos, val);
	pushUp(k);
}
inline void Update(int k, int l, int r, int L, int R, int val) {
	if(l >= L && r <= R) {
		SMT[k].tag += val; SMT[k].minx += val;
		return ;
	} int mid = (l + r) >> 1;
	if(SMT[k].tag) pushDown(k);
	if(R <= mid) Update(LeftChild(k), l, mid, L, R, val);
	else if(L > mid) Update(RightChild(k), mid + 1, r, L, R, val);
	else Update(LeftChild(k), l, mid, L, R, val), Update(RightChild(k), mid + 1, r, L, R, val);
	pushUp(k);
}
inline int QueryMin(int k, int l, int r, int L, int R) {
	if(l >= L && r <= R) return SMT[k].minx;
	if(SMT[k].tag) pushDown(k);
	int mid = (l + r) >> 1;
	if(R <= mid) return QueryMin(LeftChild(k), l, mid, L, R);
	else if(L > mid) return QueryMin(RightChild(k), mid + 1, r, L, R);
	else return min(QueryMin(LeftChild(k), l, mid, L, R), QueryMin(RightChild(k), mid + 1, r, L, R));
} 
int main(int argc, char *argv[]) {
	/*FILE_IN("data.in");*/ read(n);
	FOR(i, 1, n, 1) read(a[i]), 
		pre[i][0] = pre[i - 1][0] + (a[i] == 0),
		pre[i][1] = pre[i - 1][1] + (a[i] == 1);
	read(q);
	FOR(i, 1, q, 1) {
		int ql, qr; read(ql); read(qr);
		S[ql].push_back(qr);
	} FOR(i, 0, (MAXN << 2) - 1, 1) SMT[i].minx = 1e9;
	Insert(1, 0, n, 0, 0);
	FOR(i, 1, n, 1) {
		for(auto j : S[i]) Insert(1, 0, n, j, QueryMin(1, 0, n, 0, j));
		Update(1, 0, n, 0, i - 1, a[i] ? 1 : -1);
	} printf("%d\n", QueryMin(1, 0, n, 0, n) + pre[n][0]);
	return 0;
}

Measured memory_bytes: 23072