#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1500000;
int n;
int sum[maxn];
int a[maxn];
int f[maxn];
int find(int x)//找到下个未装满
{
return x==f[x]?x:f[x]=find(f[x]);
}
void Merge(int x,int y)//合并装满的
{
int xx=find(x);
int yy=find(y);
if(xx>yy)
{
f[yy]=xx;
}
else
f[xx]=yy;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
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 o;
scanf("%d",&o);
if(o==1)
{
int index,ha;
scanf("%d%d",&index,&ha);
while(ha>0)
{
int ff=find(index);
if(ff==n+1) break;
if(a[ff]-sum[ff]>=ha)
{
sum[ff]+=ha;
ha=0;
}
else
{
ha-=a[ff]-sum[ff];
sum[ff]=a[ff];
Merge(ff,ff+1);
}
index=ff;
}
}
if(o==2)
{
int t;
scanf("%d",&t);
printf("%d\n",sum[t]);
}
}
}
}
CF317D. Vessels(并查集)
最新推荐文章于 2023-05-27 19:40:23 发布