#include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const int N = 1e5 + 10;   const int LG = 20;   int power(int a, int b) {     int res = 1;     while (b > 0) {       if (b & 1) {         res = 1LL * res * a % mod;       }       a = 1LL * a * a % mod;       b >>= 1;     }     return res;   }   int seg[4 * N], lazy[4 * N];   void update(int node, int start, int end, int l, int r, int val) {     if (lazy[node]) {       seg[node] += lazy[node];       if (start != end) {         lazy[node << 1] += lazy[node];         lazy[node << 1 | 1] += lazy[node];       }       lazy[node] = 0;     }     if (start > end || r < start || end < l) return;     if (l <= start && end <= r) {       seg[node] += val;       if (start != end) {         lazy[node << 1] += val;         lazy[node << 1 | 1] += val;       }       return;     }     int mid = (start + end) >> 1;     update(node << 1, start, mid, l, r, val);     update(node << 1 | 1, mid + 1, end, l, r, val);     seg[node] = min(seg[node << 1], seg[node << 1 | 1]);   }   int query(int node, int start, int end, int l, int r) {     if (lazy[node]) {       seg[node] += lazy[node];       if (start != end) {         lazy[node << 1] += lazy[node];         lazy[node << 1 | 1] += lazy[node];       }       lazy[node] = 0;     }     if (start > end || r < start || end < l) return 1e9;     if (l <= start && end <= r) {       return seg[node];     }     int mid = (start + end) >> 1;     return min(query(node << 1, start, mid, l, r),                query(node << 1 | 1, mid + 1, end, l, r));   }   int main() {     int n, m, a[N], ans = 0, idx = 0;     vector<pair<int, int> > lft[N], rght[N];     scanf( %d %d , &n, &m);     for (int i = 1; i <= n; i++) {       scanf( %d , &a[i]);       update(1, 1, n, i, i, a[i]);     }     for (int i = 1; i <= m; i++) {       int l, r;       scanf( %d %d , &l, &r);       lft[r].push_back({l, i});       rght[l].push_back({r, i});     }     for (int i = 1; i <= n; i++) {       int val = a[i] - query(1, 1, n, 1, i - 1);       if (val > ans) {         idx = i;         ans = val;       }       for (auto l : lft[i]) {         update(1, 1, n, l.first, i, -1);       }     }     memset(seg, 0, sizeof(seg));     memset(lazy, 0, sizeof(lazy));     for (int i = 1; i <= n; i++) {       update(1, 1, n, i, i, a[i]);     }     for (int i = n; i >= 1; i--) {       int val = a[i] - query(1, 1, n, i + 1, n);       if (val > ans) {         idx = -i;         ans = val;       }       for (auto r : rght[i]) {         update(1, 1, n, i, r.first, -1);       }     }     printf( %d n , ans);     vector<int> res;     if (idx > 0) {       for (int i = 1; i < idx; i++) {         for (auto j : lft[i]) {           res.push_back(j.second);         }       }     } else if (idx < 0) {       for (int i = n; i > abs(idx); i--) {         for (auto j : rght[i]) {           res.push_back(j.second);         }       }     }     printf( %d n , res.size());     for (int pp : res) {       printf( %d  , pp);     }     return 0;   }   