提交时间:2024-10-02 19:50:58
运行 ID: 33014
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; int n, q, cnt; int a[100010]; long long s[100010]; struct node { int op, x; } ; node t[100010]; int cal(int p) { for (int i = 1; i <= cnt; i++) if (a[i] >= p) return a[i]; return n + 1; } int main() { cin >> n >> q; for (int i = 1; i <= n; i++) cin >> t[i].op >> t[i].x; for (int i = 1; i <= n; i++) { s[i] = s[i - 1]; if (t[i].op == 2 && t[i].x != 1) a[++cnt] = i; else if (t[i].op == 1) s[i] += t[i].x; } while (q--) { int l, r; cin >> l >> r; int p = l; long long ans = 0; bool flag = false; while (p <= r) { int pos = cal(p); if (pos > r) { pos = r; ans += s[pos] - s[p - 1]; if (t[r].op == 2) ans *= t[r].x; if (ans < 0 || ans >= 1e18) flag = true; break; } ans += s[pos] - s[p - 1]; if (ans < 0 || ans >= 1e18) { flag = true; break; } ans *= t[pos].x; if (ans < 0 || ans >= 1e18) { flag = true; break; } p = pos + 1; } if (flag) cout << "-1" << endl; else cout << ans << endl; } return 0; }