思路很简单,应该可以看得出来吧。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e6 + 7;
const int inf = 0x3f3f3f3f;
#define int ll
int n, pos = 0;
struct Array {
int l;
int r;
int len;
ll sum;
}a[N];
signed main () {
scanf ("%d", &n);
for (int i = 1; i <= n; i ++) {
int op, l, r;
ll k;
scanf ("%lld", &op);
if (op == 1) {
scanf ("%lld%lld", &l, &r);
a[++ pos].l = l;
a[pos].r = r;
a[pos].len = r - l + 1;
a[pos].sum = (a[pos].r + a[pos].l) * a[pos].len / 2;
}
else if (op == 2) {
scanf ("%lld", &k);
ll ans = 0;
while (114514) {
if (k >= a[pos].len) {
k -= a[pos].len;
ans += a[pos].sum;
pos --;
}
else {
//cout << "now posl: " << a[pos].l << " now posr: " << a[pos].r << " now k: " << k << endl;
ans += (a[pos].r + a[pos].r - k + 1) * k / 2;
a[pos].r -= k;
a[pos].len = a[pos].r - a[pos].l + 1;
a[pos].sum = (a[pos].l + a[pos].r) * a[pos].len / 2;
break;
}
}
printf ("%lld\n", ans);
}
}
return 0;
}