#include<algorithm> #include<cstring> #include<iostream> #include<set> #include<utility> #include<vector> usingnamespace std; constint N = 1e5 + 5, S = 316; int arr[N], bl[N]; short f[S + 30][S + 30][S + 30]; int lst[N], fd[S + 30][N]; int sum[S + 30][N];
bool vis[N];
int ch[N]; int top = 0; pair<int, int> solve(int l, int r, int a, int b){ int num = 0, cnt = 0; if (bl[l] == bl[r]) { for (int i = l; i <= r; ++i) { if (a <= arr[i] && arr[i] <= b) { num++; vis[arr[i]] = 1; ch[++top] = arr[i]; } } for (int i = 1; i <= top; i++) { if (vis[ch[i]]) cnt++; vis[ch[i]] = 0; } top = 0; returnmake_pair(num, cnt); } if (bl[l] + 1 <= bl[r] - 1) { num += (sum[bl[r] - 1][b] - sum[bl[l]][b]) - (sum[bl[r] - 1][a - 1] - sum[bl[l]][a - 1]);
for (int i = bl[a] + 1; i <= bl[b] - 1; ++i) cnt += f[bl[l] + 1][bl[r] - 1][i]; }
for (int i = l; bl[l] == bl[i]; ++i) { int v = arr[i]; if (a <= v && v <= b) { num++; if (!vis[v]) { vis[v] = 1; ch[++top] = v; if (bl[a] < bl[v] && bl[v] < bl[b]) { if (bl[r] - bl[l] <= 1 || fd[bl[l] + 1][v] > (bl[r] - 1) * S) { cnt++; } } } } } for (int i = r; bl[r] == bl[i]; --i) { int v = arr[i]; if (a <= v && v <= b) { num++; if (!vis[v]) { vis[v] = 1; ch[++top] = v; if (bl[a] < bl[v] && bl[v] < bl[b]) { if (bl[r] - bl[l] <= 1 || fd[bl[l] + 1][v] > (bl[r] - 1) * S) { cnt++; } } } } } for (int v = a; v <= b && bl[v] == bl[a]; ++v) { if (vis[v]) { cnt++; } elseif (bl[r] - bl[l] >= 2 && fd[bl[l] + 1][v] <= (bl[r] - 1) * S) { cnt++; } } if (bl[a] != bl[b]) { for (int v = b; v >= a && bl[v] == bl[b]; --v) { if (vis[v]) { cnt++; } elseif (bl[r] - bl[l] >= 2 && fd[bl[l] + 1][v] <= (bl[r] - 1) * S) { cnt++; } } } for (int i = 1; i <= top; i++) { vis[ch[i]] = 0; } top = 0; returnmake_pair(num, cnt); } intmain(){ ios::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; for (int i = 1; i <= N - 5; ++i) { bl[i] = (i - 1) / S + 1; } for (int i = 1; i <= n; i++) { cin >> arr[i]; sum[bl[i]][arr[i]]++; } for (int i = 1; i <= bl[n]; i++) for (int v = 1; v <= N - 5; v++) sum[i][v] += sum[i][v - 1]; for (int i = 1; i <= bl[n]; i++) for (int v = 1; v <= N - 1; v++) sum[i][v] += sum[i - 1][v]; for (int i = 1; i <= bl[n]; ++i) { // memset(vis, 0, sizeof(vis)); for (int j = (i - 1) * S + 1; j <= n; j++) { if (!vis[arr[j]]) { f[i][bl[j]][bl[arr[j]]]++; vis[arr[j]] = 1; ch[++top] = arr[j]; } } for (int j = i + 1; j <= bl[n]; j++) { for (int k = 1; k <= bl[N - 5]; k++) { f[i][j][k] += f[i][j - 1][k]; } } for (int i = 1; i <= top; i++) vis[ch[i]] = 0; top = 0; } // memset(vis, 0, sizeof(vis));
// memset(lst, 0x3f, sizeof(lst)); for (int i = 1; i < N; i++) { lst[i] = 0x3f3f3f3f; } for (int i = n; i >= 1; --i) { lst[arr[i]] = i; if (i % S == 1) { for (int j = 1; j <= N - 5; j++) { fd[bl[i]][j] = lst[j]; } } }
while (m--) { int l, r, a, b; cin >> l >> r >> a >> b; auto res = solve(l, r, a, b); cout << res.first << " " << res.second << "\n"; } return0; }