参考http://www.cnblogs.com/qscqesze/p/5792926.html
题意
给你一个nm的矩阵,里面有k条链,你有q次询问
每次询问可以使得一条链变成0,或者使得这条链变成原来的值。
然后查询一个矩阵的权值和。
分析。。没有卡。不知道为何。。自己的代码错了,直接贴别人的
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e3+6;
long long d[maxn][maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int w)
{
for(int i=x;i<maxn;i+=lowbit(i))
for(int j=y;j<maxn;j+=lowbit(j))
d[i][j]+=w;
}
long long get(int x,int y)
{
long long ans = 0;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
ans+=d[i][j];
return ans;
}
vector<int> px[maxn],py[maxn],pw[maxn];
int flag[maxn],la[maxn];
char op[25];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
int num;scanf("%d",&num);
la[i]=1;
for(int j=1;j<=num;j++)
{
int x,y,z;scanf("%d%d%d",&x,&y,&z);
px[i].push_back(x);
py[i].push_back(y);
pw[i].push_back(z);
}
}
int q;scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%s",op);
if(op[0]=='S')
{
int a;scanf("%d",&a);
flag[a]^=1;
}
else{
int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
for(int j=1;j<=k;j++)
{
if(la[j]==flag[j])continue;
if(flag[j]==0)
{
for(int i2=0;i2<px[j].size();i2++)
update(px[j][i2],py[j][i2],pw[j][i2]);
la[j]=flag[j];
}
else
{
for(int i2=0;i2<px[j].size();i2++)
update(px[j][i2],py[j][i2],-pw[j][i2]);
la[j]=flag[j];
}
}
printf("%lld\n",get(c,d)+get(a-1,b-1)-get(c,b-1)-get(a-1,d));
}
}
}