如题
/*
*/
#include <stdio.h>
#include <iostream>
using namespace std;
struct Stack
{
int left, right;
};
Stack ans[500001];//n <= 5 * 10^5
long long int l, r;
int top;
long long int f(int len, int up, int down)
{//等差数列求和
return len * (up + down) / 2;
}
int main (void)
{
int n;//n次操作
cin >> n;
while (n --)
{
int opre;
cin >> opre;
if (opre == 1)
{//存放 从l到r的团子
cin >> l >> r;
ans[++top].left = l;//入栈
ans[top].right = r;
}
else
{
long long int num;//想要团子的个数
cin >> num;
long long int sum = 0;//要支付的钱
while (num > ans[top].right - ans[top].left + 1)//把存着时 是完整的团子区间 给剪掉
{
sum += f(ans[top].right - ans[top].left + 1, ans[top].right, ans[top].left);//计算
num -= ans[top].right - ans[top].left + 1;//削减
top--;//弹出
}
l = ans[top].right - num + 1;//方便后续计算
sum += f(ans[top].right - l + 1, l, ans[top].right);
ans[top].right = l - 1;//修改栈顶 右端点的值
cout << sum << endl;
}
}
return 0;
}
/*
测试:
-----------------------------
-----------------------------
总结:
1. 栈不能直接用,直接用辅助空间会爆掉,所以得用端点来保存(毕竟是连续的
2. 出栈的操作得在 一轮中最后来实现
*/