CODEVS 1081 (+ update interval single point of inquiry)

Topic links: http://codevs.cn/problem/%EF%BC%91%EF%BC%90%EF%BC%98%EF%BC%91/

 

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <cstring>
#include <map>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long lll;
const int maxn = 4000005;
const lll INF = 0x3f3f3f3f3f;
int dir[8][2]= {0,1,1,0,0,-1,-1,0,1,-1,-1,-1,1,1,-1,1};
int dir2[4][2]= {0,1,0,-1,1,0,-1,0};
bool flag;
int a[maxn],sum[maxn],n,ans,num[maxn],b[maxn];
void pushup(int k)
{
    sum[k] = sum[k*2] + sum[k*2+1];
}
void Build ( int K, int L, int R & lt) // recursive achievements 
{
     IF (L == R & lt)
    {
        sum[k] = a[l];
        return ;
    }
    else
    {
        int mid = (l+r) / 2;
        build(k<<1,l,mid);
        build(k*2+1,mid+1,r);
        pushup(k);
    }
}
void pushdown(int k)
{
    if(num[k]){
        num[k<<1] += num[k];
        Surely [k * 2 + 1 ] + = num [k];
        sum[k<<1] += num[k];
        I [k * 2 + 1 ] + = num [k];
        Surely [k] = 0 ;
    }
}
void update(int l,int r,int L,int R,int k,int v)//单点更新
{
    if(L >= l && R <= r)
    {
        sum [k] + = v;
        Surely [k] + = v;
        return ;
    }
    else
    {
        pushdown(k);
        int mid = (L + R) / 2;
        if(l <= mid) update(l,r,L,mid,k*2,v);
        if(mid < r) update(l,r,mid+1,R,k*2+1,v);
        pushup(k);
    }
}
void Search(int l,int r,int L,int R,int k)//区间查询
{
    if(L == l&& R == r)
    {
        ans = sum[k];
        return;
    }
    pushdown(k);
    int mid = (L + R) / 2;
    if(mid >= l)  Search(l,r,L,mid,k*2);
    if(mid < r)  Search(l,r,mid+1,R,k*2+1);
}
int main ()
{
    int m;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    mem(sum);
    Build ( . 1 , . 1 , n-); // achievements 
    int Z, X, C, S;
    cin >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> z;
        if(z == 1)
            {
                cin >> x >> c >> s;
                update(x,c,1,n,1,s);
            }
        else
        {
           cin >> x;
           years = 0 ;
           Search(x,x,1,n,1);
           cout << ans << endl;
        }
    }
    return 0;
}

 

Guess you like

Origin www.cnblogs.com/LLLAIH/p/11321830.html