#include <bits/stdc++.h>
using namespace std;

using ll=long long;
using vi=vector<int>;
using vvi=vector<vi>;
using vl=vector<ll>;
using vvl=vector<vl>;
using vpii=vector<pair<int,int>>;
using vpll=vector<pair<ll,ll>>;
using vs=vector<string>;
using vvc=vector<vector<char>>;

const ll INF=1e18;
const int inf=1e9;
const double eps=1e-10;
const double pi=acos(-1);
const ll mod=1e9+7;
const ll MOD=998244353;

//数学関連
int num_order(ll N){
  int res=0;
  
  while(N>0){
    N/=10;
    res++;
  }
  
  return res;
}
ll GCD(ll A,ll B){
  if(B==0){
    return A;
  }
  else{
    return GCD(B,A%B);
  }
}
ll LCM(ll A,ll B){
  ll g=GCD(A,B);
  return A/g*B;
}
vpll prime_factorize(ll N){
  vpll res;
  
  for(ll i=2;i*i<=N;i++){
    if(N%i!=0){
    continue;
    }
    
    ll ex=0;
    while(N%i==0){
      ex++;
      N/=i;
    }
    
    res.push_back({i,ex});
  }
  
  if(N!=1){
  res.push_back({N,1});
  }
  
  return res;
}
ll modpow(ll x,ll p,ll y){
  ll res=1;
  
  while(p>0){
    if(p&1) res=res*x%y;
    x=x*x%y;
    p>>=1;
  }
  
  return res;
}
ll small_nCk(ll n,ll k){
  ll res=1,fact=1;
  
  for(int i=0;i<k;i++){
    res=res*(n-i)/fact;
    fact++;
  }
  
  return res;
}

//データ構造
struct UnionFind {
    //自身が親であれば、その集合に属する頂点数に-1を掛けたもの
    //そうでなければ親のid
    vector<int> r;
 
    UnionFind(int N){
        r=vector<int>(N,-1);
    }
 
    int root(int x){
        if (r[x]<0) return x;
        return r[x]=root(r[x]);
    }
 
    bool unite(int x,int y){
        x=root(x);
        y=root(y);
        if(x==y) return false;
        if(r[x]>r[y]) swap(x,y);
        r[x]+=r[y];
        r[y]=x;
        return true;
    }
 
    int size(int x){
        return -r[root(x)];
    }
};
 
int main(){
  
  int N,X;
  cin>>N>>X;
  
  vpii vec(N);
  for(int i=0;i<N;i++) cin>>vec[i].first>>vec[i].second;
  
  int sum=0;
  
  
  for(int i=0;i<N;i++){
    sum+=(vec[i].first*vec[i].second);
    
    if(sum>X*100){
      cout<<i+1<<endl;
      return 0;
    }
  }
  
  cout<<-1<<endl;
}
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <tuple>
#include <vector>
using namespace std;
using ll = int64_t;
#define rep(i, j, n) for (int i = j; i < (n); ++i)
#define rrep(i, j, n) for (int i = (n)-1; j <= i; --i)

constexpr int INF = 0x3f3f3f3f;

int main() {
  int n, m;
  cin >> n >> m;
  vector<int> w(n);
  for (int& x : w) cin >> x;
  
  int maxw = *max_element(w.begin(), w.end());
  vector<int> cost(1 << n);
  for (int i = 0; i < m; ++i) {
    int l, v;
    cin >> l >> v;
    if (maxw > v) {
      cout << -1 << '\n';
      return 0;
    }
    for (int bit = 0; bit < 1 << n; ++bit) {
      int s = 0;
      for (int j = 0; j < n; ++j)
        if (bit >> j & 1) s += w[j];
      if (s > v) cost[bit] = max(cost[bit], l);
    }
  }

  vector<int> p(n);
  iota(p.begin(), p.end(), 0);
  // らくだの集合を考えるとこれ以上血がづいてはいけないという制約がたくさん
  // 蟻本によるとグラフの辺と同義っぽい
  // らくだが数直線上にいるとして、pos[i]に位置が入ってるとする
  // らくだiとjがl離れていないといけない → pos[i] + l <= pos[j]
  // 一方グラフの辺は最短経路を考えたときにv[from] + cost >= v[to]
  // みたいな感じになってる　蟻本より
  // pos[i] + l <= pos[j] <=> pos[j] - l >= pos[i]
  // なのでj -> iに-lの辺を張ったのと同じ
  // 並び順を維持するので
  // 0<= i < j < nに対してpos[i] <= pos[j] <=> pos[j] + 0 >= pos[i]
  // j -> iにコスト0の辺を張る
  int ans = INF;
  using tii = tuple<int, int, int>;
  do {
    // 後ろ側から見て、前に辺を張っていく
    vector<tii> es;
    for (int r = 1; r < n; ++r) {
      int s = 1 << p[r];
      for (int l = r - 1; l >= 0; --l) {
        s |= 1 << p[l];
        es.emplace_back(r, l, -cost[s]);
      }
    }
    for (int i = 0; i < n - 1; ++i) es.emplace_back(i + 1, i, 0);

    // べるまん・フォード]]
    vector<int> d(n, INF);
    d[n - 1] = 0;
    for (int i = 0; i <= n; ++i)
      for (auto& [f, t, c] : es)
        if (d[f] != INF && d[t] > d[f] + c) d[t] = d[f] + c;

    if (d[0] != INF) ans = min(ans, -d[0]);
  } while (next_permutation(p.begin(), p.end()));
  cout << ans;
  return 0;
}