#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+7; // 根据实际需求设置合适的大小
int n, m; // 天数和订单的数量
int a[N];
int d[N], s[N], t[N];
int dd[N]; // 差分数组
bool check(int mid) { // 到第mid个订单是否可以满足条件
memset(dd, 0, sizeof(dd)); // 初始化差分数组为0
//差分数组dd的含义是每天新增或减少的订单数量。对于第i天,dd[i]表示第i天新增的订单数量减去前一天完成的订单数量。因此,差分数组的初始化应该为0
for (int i = 1; i <= mid; i++) {
dd[s[i]] += d[i];//第s[i]天起开始需要d[i]个桌子
dd[t[i] + 1] -= d[i];
}
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += dd[i];//其实sum也就代表了每一天的需要的教室数量,因为差分求和就是a[i]
if (a[i] < sum) return false; // 在前面就不行了
}
return true;
}
//因为订单时有顺序的所以这是有二段性的
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) {
cin >> d[i] >> s[i] >> t[i];
}
int l = 0, r = m;//有可能一个订单也满足不了 计算能满足前多少个订单
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid; // 如果前mid个订单都能满足
else r = mid - 1;
}
if (r == m)
cout << 0 << '\n';
else
cout << -1 <<'\n'<< r + 1 << '\n';
}
signed main() {
int t = 1;
while (t--) solve();
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+7;
int n,k;
int h[N],w[N];
//mid是问的输出的答案 在return时候的条件尽量要与题目中的别的变量扯上关系
bool check(int mid){//表示巧克力的最大边长
int cnt=0;
for(int i=1;i<=n;i++){//对于第i个巧克力
cnt+=(h[i]/mid)*(w[i]/mid);//长上能分出来的份数+宽上能分出来的份数
}
if(cnt>=k)return true;
else return false;
}
void solve() {
cin>>n>>k;//n个巧克力 分出来k块 邱最大边长
for(int i=1;i<=n;i++){
cin>>h[i]>>w[i];
}
int l=0,r=max(*max_element(h+1,h+n+1),*max_element(w+1,w+n+1)) ;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<r;
}
signed main() {
int t = 1;
while (t--) solve();
return 0;
}