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 <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
 
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds;
using namespace std;
// typedef pair<int,int> pii;
// tree <pii,null_type,greater<pii>,rb_tree_tag,tree_order_statistics_node_update> tr;
// cin.tie(0);
// std::ios::sync_with_stdio(false);
typedef long long LL;
const int N = 200005;
const int M = 205;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
const int MOD = 1e9+7;
const double eps = 1e-8;
int n,m;
int dp[N];
int s[N];
std::vector<char> G[N];
int tr[N<<2];
int pre[N];
int ini()
{
    memset(pre,0,sizeof pre);
    memset(dp,INF,sizeof dp);
    for (int i=0;i<=n;i++)
        G[i].clear();
}
void update(int x,int c,int l,int r,int rt)
{
    if (l==r)
    {
        tr[rt] = c;
        return;
    }
    int mid = (l+r)>>1;
    if (x<=mid)
        update(x,c,l,mid,rt<<1);
    else
        update(x,c,mid+1,r,rt<<1|1);
    tr[rt] = min(tr[rt<<1],tr[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt)
{
    if (L<=l && r<=R)
        return tr[rt];
    int mid = (l+r)>>1;
    int res = INF;
    if (L<=mid)
        res = min(res,query(L,R,l,mid,rt<<1));
    if (mid<R)
        res = min(res,query(L,R,mid+1,r,rt<<1|1));
    return res;
}
int main()
{
    while (~scanf("%d",&n))
    {
        ini();
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&s[i]);
            pre[i] = pre[i-1]+(1-s[i]);
        }
        scanf("%d",&m);
        for (int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            G[b].push_back(a);
        }
        int ans = 0;
        dp[0] = 0;
        memset(tr,0,sizeof tr);
        for (int i=1;i<=n;i++)
        {
            for (int j=0;j<G[i].size();j++)
            {
                int l = G[i][j];
                int r = i;
                int tmp;
                // if(l==1)
                //     tmp=0;
                // else
                //     tmp = query(1,l-1,1,n,1);
                // cout<<"bug "<<r<<" "<<l<<" "<<tmp<<endl;
                tmp = dp[l-1];
                dp[r] = min(dp[r],tmp+(pre[r]-pre[l-1]));
            }
            // dp[i] = min(dp[i],i-pre[i]);
            dp[i] = min(dp[i],dp[i-1]+s[i]);
            // update(i,dp[i],1,n,1);
        }
        // for (int i=1;i<=n;i++)
        //     cout<<dp[i]<<" ";
        // cout<<endl;
        ans = dp[n];
        printf("%d\n", ans);
    }
    return 0;
}
 
/*
 
3
1 0 1
1
1 3
 
3
1 0 1
2
1 1
3 3
 
3
1 0 1
2
1 1
2 3
 
5
0 1 0 1 0
1
1 5
 
9
0 1 0 1 1 1 0 1 0
3
1 4
5 8
6 7
 
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
 
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
 
*/