求助树状数组
  • 板块学术版
  • 楼主WaterSky
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/11/9 13:49
  • 上次更新2023/11/9 16:52:46
查看原帖
求助树状数组
708963
WaterSky楼主2023/11/9 13:49

给定一个有n个元素的正整数数列 a[1],a[2],…,a[n],你需要依次进行m个操作,操作有两类: 1 i d:给定i,d,将 a[i] 加上 d; 0 k:给定k,求最小的r,使得a[1]+a[2]+⋯+a[r]的值>=k,如果没有找到,输出“-1”。

#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,z;
long long a[500005],C[2000010];
void add(long long x,long long k)
{
    while(x<=n)
        C[x]+=k,x+=x&(-x);
}
long long sum(long long x)
{
    long long ans=0;
    while(x!=0)
        ans+=C[x],x-=x&(-x);
    return ans;
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),add(i,a[i]);
    for(int i=1;i<=m;i++)
    {
    	scanf("%lld%lld",&x,&y);
        if(x==1) 
		scanf("%lld",&z),add(y,z);
        else 
        {
        	for(int j=1;j<=n;j++)
			{
				if(sum(j)>=y) 
				{
					printf("%d",j);
					goto school;
				}
			} 
			printf("-1");
			school:;
			cout<<'\n';
        }
    }
    return 0;
}
2023/11/9 13:49
加载中...