Codeforces 390E.Inna and Large Sweet Matrix

树状数组改段求段。。

A. Inna and Large Sweet Matrix

Time Limit: 1000ms
Memory Limit: 524288KB
64-bit integer IO format:  %I64d      Java class name:  (Any)
Submit  Status
Inna loves sweets very much. That's why she wants to play the "Sweet Matrix" game with Dima and Sereja. But Sereja is a large person, so the game proved small for him. Sereja suggested playing the "Large Sweet Matrix" game.

The "Large Sweet Matrix" playing field is an n × m matrix. Let's number the rows of the matrix from 1 ton, and the columns — from 1 to m. Let's denote the cell in the i-th row and j-th column as (i, j). Each cell of the matrix can contain multiple candies, initially all cells are empty. The game goes in w moves, during each move one of the two following events occurs:

  1. Sereja chooses five integers x1, y1, x2, y2, v (x1 ≤ x2, y1 ≤ y2) and adds v candies to each matrix cell(i, j) (x1 ≤ i ≤ x2y1 ≤ j ≤ y2).
  2. Sereja chooses four integers x1, y1, x2, y2 (x1 ≤ x2, y1 ≤ y2). Then he asks Dima to calculate the total number of candies in cells (i, j) (x1 ≤ i ≤ x2y1 ≤ j ≤ y2) and he asks Inna to calculate the total number of candies in the cells of matrix (p, q), which meet the following logical criteria: (p < x1 OR p > x2) AND (q < y1 OR q > y2). Finally, Sereja asks to write down the difference between the number Dima has calculated and the number Inna has calculated (D - I).

Unfortunately, Sereja's matrix is really huge. That's why Inna and Dima aren't coping with the calculating. Help them!

Input

The first line of the input contains three integers nm and w (3 ≤ n, m ≤ 4·106; 1 ≤ w ≤ 105).

The next w lines describe the moves that were made in the game.

  • A line that describes an event of the first type contains 6 integers: 0x1y1x2y2 and v (1 ≤ x1 ≤ x2 ≤ n; 1 ≤ y1 ≤ y2 ≤ m; 1 ≤ v ≤ 109).
  • A line that describes an event of the second type contains 5 integers: 1x1y1x2y2 (2 ≤ x1 ≤ x2 ≤ n - 1; 2 ≤ y1 ≤ y2 ≤ m - 1).

It is guaranteed that the second type move occurs at least once. It is guaranteed that a single operation will not add more than 109 candies.

Be careful, the constraints are very large, so please use optimal data structures. Max-tests will be in pretests.

Output

For each second type move print a single integer on a single line — the difference between Dima and Inna's numbers.

Sample Input

Input
4 5 5
0 1 1 2 3 2
0 2 2 3 3 3
0 1 5 4 5 1
1 2 3 3 4
1 3 4 3 4
Output
2
-21


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define ll long long
#define prt(k) cout<<#k"="<<k<<" ";
#define N 4000050
ll b[N][2],c[N][2];
int lowbit(int x) { return x&-x; }
int n,m;
void add(int p,ll v,int t)
{
    if(p==0) return;
    for(int i=p;i;i-=lowbit(i)) b[i][t]+=v;
    for(int i=p;i<N;i+=lowbit(i)) c[i][t]+=v*p;
}
ll sumb(int p,int t)
{
    ll ret=0;
    for(int i=p;i<N;i+=lowbit(i)) ret+=b[i][t];
    return ret;
}
ll sumc(int p,int t)
{
    ll ret=0;
    for(int i=p;i;i-=lowbit(i)) ret+=c[i][t];
    return ret;
}
ll sum(int x,int t)
{
    if(x==0) return 0;
    return sumb(x,t)*x+sumc(x-1,t);
}
int w;
int main()
{
    cin>>n>>m>>w;
    for(int i=0;i<w;i++)
    {
        int o,x1,y1,x2,y2;
        ll v;
        scanf("%d%d%d%d%d",&o,&x1,&y1,&x2,&y2);
        if(o==0)
        {
            scanf("%lld",&v);
            ll a=y2-y1+1,b=x2-x1+1;
            add(x2,v*a,0); add(x1-1,-v*a,0);
            add(y2,v*b,1); add(y1-1,-v*b,1);
        }
        else
        {
            ll a=sum(x1-1,0); ll b=sum(n,0)-sum(x2,0);
            ll c=sum(y1-1,1); ll d=sum(m,1)-sum(y2,1);
            ll ans=sum(n,0)-a-b-c-d;
          //  prt(sum(m,1)); prt(a); prt(b); prt(c); prt(d);  puts("");
            printf("%lld\n",ans);
        }

    }
}


你可能感兴趣的:(map,ACM,iostream,树状数组,CString)