hoj1640 mobile phone

/*This Code is Submitted by billforum for Problem 1640 at 2012-02-10 20:37:39*/
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=1030;

int t[N][N],maxi,maxj;

/*int lowbit(int k)
{
    return k & (k ^(k - 1));
}

void update(int x, int y, int val)
{
    for (int i = x; i <= maxi; i += lowbit(i))
        for (int j = y; j <= maxj; j += lowbit(j))
            t[i][j] += val;
}

int sumn(int x, int y)
{
    int s = 0;
    for (int i = x; i > 0; i -= lowbit(i))
        for (int j = y; j > 0; j -= lowbit(j))
            s += t[i][j];
    return s;
}
*/
void update(int i,int j,int v)
{
        int j0=j;
        while(i<=maxi)
        {
                j=j0;
                while(j<=maxj)
                {
                        t[i][j]+=v;
                        j=(j|(j-1))+1;
                                              //  j+=(j&(-j));
                }//while
                i=(i|(i-1))+1;
                               // i+=(i&(-i));
        }//while
        return;
}

int sumn(int i,int j)
{
        int j0=j,sum=0;
        while(i>0)
        {
                j=j0;
                while(j>0)
                {
                        sum+=t[i][j];
                        //j-=(j&(-j));
                                                 j=(j&(j-1));
                }
                i=(i&(i-1));
                                // i-=(i&(-i));
        }//while
        return sum;
}

int main(){
 int dre,s;
 int x,y,v;
 int x1,y1,x2,y2;
//ios::sync_with_stdio(false);
 while(scanf("%d",&dre)!=EOF)
 {
        if(dre==0)
                {
                     //  cin>>s;
                                                scanf("%d",&s);
                           maxi=s;
                           maxj=s;
                           for(int i=0;i<=maxi;i++)
                                   for(int j=0;j<=maxj;j++)
                                       t[i][j]=0;
                }
      else if(dre==1)
          {
                      // cin>>x>>y>>v;
                                          scanf("%d%d%d",&x,&y,&v);
                           update(x+1,y+1,v);
          }
          else if(dre==2)
          {
                      //cin>>x1>>y1>>x2>>y2;
                                           scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                          //cout<<(sumn(x2+1,y2+1)+sumn(x1,y1)-sumn(x1,y2+1)-sumn(x2+1,y1))<<endl;
                                                  int sum=sumn(x2+1,y2+1);  
            sum-=sumn(x1,y2+1);  
            sum-=sumn(x2+1,y1);  
            sum+=sumn(x1,y1);  
            printf("%d\n",sum);  
          }
           
        
 }
 return 0;
}

 

转载于:https://www.cnblogs.com/wuzhibin/archive/2012/02/11/2346858.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值