分块模板

#include<bits/stdc++.h>
using namespace std;

#define MAXN 50000+10

int n,blo;
int a[MAXN],bl[MAXN],tag[MAXN];

void update(int l,int r,int add)
{
    for (int i=l; i<=min(bl[l]*blo,r); i++)
        a[i]+=add;
    if (bl[l]!=bl[r])
        for (int i=(bl[r]-1)*blo+1; i<=r; i++)
            a[i]+=add;
    for (int i=bl[l]+1; i<=bl[r]-1; i++)
        tag[i]+=add;
}

int main()
{
    scanf("%d",&n),blo=sqrt(n);
    for (int i=1; i<=n; i++)
        bl[i]=(i-1)/blo+1;
    for (int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    for (int i=1; i<=n; i++)
    {
        int opt,l,r,tmp;
        scanf("%d%d%d%d",&opt,&l,&r,&tmp);
        if (opt)
            printf("%d\n",a[r]+tag[bl[r]]);
        else
            update(l,r,tmp);
    }
    return 0;
}

 

posted @ 2018-08-24 12:43  QingCai_DCF  阅读(364)  评论(0编辑  收藏  举报