CF317D. Vessels(并查集)

来源:互联网 发布:天猫跟淘宝哪个质量好 编辑:程序博客网 时间:2024/06/15 04:17
#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;}elsef[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]);}}}}