2012 ACM/ICPC Asia Regional Changchun Online A Simple Problem with Integers

http://acm.hdu.edu.cn/showproblem.php?pid=4267

思路:树状数组更新。

View Code
#include<stdio.h>
#include<string.h>
#include<iostream>
#define lowbit(x) (x)&(-x)
using namespace std;
const int maxn = 50005;
int sum[maxn][11][11],n;
int as[maxn];
void add(int x,int c,int k,int md)
{
    for(; x <= n; x += lowbit(x))
        sum[x][k][md] += c;
}
int getsum(int x)
{
    int ans = 0;
    int i,b = x;
    for(;x;x-=lowbit(x)){
        for(i = 1; i <= 10; ++ i)
            ans += sum[x][i][b%i];
    }
    return ans;
}
int main()
{
    int i,j,k,m;
    while(scanf("%d",&n)==1)
    {
        for(i = 1; i <= n; ++ i)
            for(j = 0; j <= 10; ++ j)
                for(k = 0; k <= 10; ++ k)
                    sum[i][j][k] = 0;
        for(i = 1; i <= n; ++ i)
            scanf("%d",as+i);
        scanf("%d",&m);
        while(m--)
        {
            int a,b,c,k;
            scanf("%d",&i);
            if(i==1){
                scanf("%d %d %d %d",&a,&b,&k,&c);
                add(a,c,k,a%k);
                add(b+1,-c,k,a%k);
            }else{
                scanf("%d",&k);
                c = getsum(k) + as[k];
                printf("%d\n",c);
            }
        }
    }return 0;
}

posted on 2012-09-08 20:10  aigoruan  阅读(141)  评论(0)    收藏  举报

导航