[loj 6277] 수열 블록 나 누 기 연습 1

원제
블록 을 나 누 는 것 은 한 구간 을 포장 하여 처리 하여 시간의 복잡 도 를 줄 이 는 과정 이다.
//      1
#include
#include
#include
#include
#include
#define ll long long
#define N 1000009
using namespace std;

ll v[N],tag[N];
int bl[N];
int n,m,blo;

ll read()
{
	char ch=getchar();ll ret=0,f=1;
	while(ch'9'){if (ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
	return f*ret;
}

void change(int l,int r,ll d)
{
	for (int i=l;i<=min(bl[l]*blo,r);i++) v[i]+=d;
	if (bl[l]!=bl[r])
		for (int i=(bl[r]-1)*blo+1;i<=r;i++) v[i]+=d;
	for (int i=bl[l]+1;i<=bl[r]-1;i++) tag[i]+=d;
}

int main()
{	
	n=read();blo=sqrt(n);
	for (int i=1;i<=n;i++) v[i]=read();
	for (int i=1;i<=n;i++) bl[i]=(i-1)/blo+1;
	for (int i=1;i<=n;i++)
	{
		int opt=read(),l=read(),r=read();ll d=read();
		if (opt==0)	change(l,r,d);
		else printf("%lld
",v[r]+tag[bl[r]]); } return 0; }

좋은 웹페이지 즐겨찾기