分块T了三个点,玄关,拜谢
查看原帖
分块T了三个点,玄关,拜谢
737219
YONEX楼主2024/9/20 21:11
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
ll k[500005];int m,n,p;ll a,b,c,ans=0;
int add[500007],pos[500007]/*判断点属于哪一个块*/,sum[500007];
int line_l[500007],line_r[500007];
inline long long read()
{
	char cc=getchar();long long f=1,ans=0;
	while(cc<'0' or cc>'9'){if(cc=='-')f=-1;cc=getchar();}
	while(cc>='0' and cc<='9'){ans=(ans*10)+(cc-'0');cc=getchar();}
	return f*ans;
}
inline void  reads(){n=read();m=read();for(int i=1;i<=n;i++)k[i]=read();}
inline void build()
{
	int t=sqrt(n);//块的个数 
	for(int i=1;i<=t;i++){line_l[i]=(i-1)*t+1;line_r[i]=i*t;}//设置左右边界 
	if(line_r[t]<=n){t++;line_l[t]=line_r[t]+1;line_r[t]=n;}//特判最后一个块不完整 
	for(int i=1;i<=t;i++)//初始化区间加值和这个点属于那个块
	for(int j=line_l[i];j<=line_r[i];j++){pos[j]=i;sum[i]+=k[j];} 
}
inline void change_point(){a=read();b=read();k[a]+=b;} 
inline void change_line()
{
	a=read();b=read();
	if(pos[a]==pos[b]){for(int i=a;i<=b;i++)ans+=k[i];printf("%d\n",ans);return ;}
	for(int i=pos[a]+1;i<=pos[b]-1;i++)ans+=sum[i];
	for(int i=a;i<=line_r[a];i++)ans+=k[i];for(int i=line_l[b];i<=b;i++)ans+=k[i];
	printf("%d\n",ans);return ;
//	printf("%d",ans);printf("\n");
}
inline void main_d() 
{reads();for(int i=1;i<=m;i++){ans=0;p=read();if(p==1){change_point();continue;}change_line();}}
int main()
{
	main_d();
	return 0;
}
2024/9/20 21:11
加载中...