6277. 数列分块入门 1

6277. 数列分块入门 1

题目链接

传送门

区间修改,单点查询

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e4+10;
ll a[N],sum[N];
int pos[N],block;
int query(int num)
{
    return a[num] + sum[pos[num]];
}
void update(int l,int r,int c)
{
    for(int i=l;i<=min(pos[l]*block,r);i++)
    {
        a[i] += c;
    }
    if(pos[l]!=pos[r])
    {
        for(int i=(pos[r]-1)*block+1;i<=r;i++)
        {
            a[i]+=c;
        }
    }
    for(int i=pos[l]+1;i<=pos[r]-1;i++)
    {
        sum[i] += c;
    }
}
int main()
{
    int n;
    ios::sync_with_stdio(false);
    cin >> n;
    block = sqrt(n);
    for(int i=1;i<=n;i++)
    {
        cin >> a[i];
        pos[i] = (i-1)/block + 1;
    }
    for(int i=1;i<=n;i++)
    {
        int opt,l,r,c;
        cin >> opt >> l >> r >> c;
        if(opt)
            cout << query(r) << "\n";
        else
            update(l,r,c);
    }
    return 0;
}
posted @ 2020-03-05 13:47  hh13579  阅读(141)  评论(0编辑  收藏  举报