提交时间:2024-10-02 19:57:20

运行 ID: 33019

#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) { if (a[cnt] < p) return n + 1; int l = 1, r = cnt; while (l < r) { int mid = l + r >> 1; if (mid >= p) r = mid; else l = mid + 1; } return a[l]; } int main() { scanf("%d %d", &n, &q); for (int i = 1; i <= n; i++) scanf("%d %d", &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; scanf("%d %d", &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) printf("-1\n"); else printf("%lld\n", ans); } return 0; }