题意:
进行两种操作:1代表向x容器中倒入y升水
2代表 查询x容器中 的水为多少
将所有容器从下往上开始标号 1到 n,当要倒水的时候,只需要找到当前容器的祖先,所谓祖先就是最上面有水的容器,在往上就没有了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 2e5+10;
int a[maxn];
int sum[maxn];
int f[maxn];
int getf(int x)
{
int r = x;
while(r != f[r])
r = f[r];
int i = x,j;
while(f[i] != r)
{
j = f[i];
f[i] = r;
i = j;
}
return r;
}
void mix(int x,int y)
{
int t1 = getf(x);
int t2 = getf(y);
if(t1 > t2)
f[t2] = t1;
else
f[t1] = t2;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
f[i] = i;
}
f[n+1] = n+1;
int q;
scanf("%d",&q);
while(q--)
{
int op;
scanf("%d",&op);
if(op == 1)
{
int x,have;
scanf("%d%d",&x,&have);
while(have > 0)
{
int F = getf(x);
if(F == n+1) break;
if(a[F] - sum[F] >= have)
{
sum[F] += have;
have = 0;
}
else
{
have -= a[F] - sum[F];
sum[F] = a[F];
mix(F,F+1);
}
x = F;
}
}
else
{
int x;
scanf("%d",&x);
printf("%d\n",sum[x]);
}
}
}
return 0;
}