思路:直接暴力模拟会tle8,用集合维护当前为满的容器,然后如果有溢出二分找到下一个没满的容器。
int sz[N];
int a[N];
int n, m;
set<int> st;
void fun1(int id,int w)
{
while (1)
{
int tt = a[id];
a[id] = min(sz[id], a[id] + w);
int val = a[id] - tt;
w -= val;
if (a[id] == sz[id])st.erase(id);
if (w == 0)break;
if (st.empty())break;
else
{
auto it = st.upper_bound(id);//第一个没有满的
if(it!=st.end())
id = *it;
else break;
}
}
}
int fun2(int k)
{
return a[k];
}
int main()
{
cin >> n;
f(i, 1, n)scanf("%d", &sz[i]);
f(i, 1, n) { st.insert(i); }
cin >> m;
int a, b, c;
f(i, 1, m)
{
scanf("%d", &a);
if (a == 1)
{
scanf("%d%d", &b, &c);
fun1(b,c);
}
else
{
scanf("%d", &b);
printf("%d\n", fun2(b));
}
}
return 0;
}