| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用二维线段树WA爆掉了!why?/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月17日, 下午12:58
*/
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct Tree
{
int left;
int right;
int sum;
};
typedef struct Node
{
int left;
int right;
Tree tree[3*1048];
};
Node node[1048*3];
int n;
void build1(int t,int root,int l,int r)
{
node[t].tree[root].left = l;
node[t].tree[root].right = r;
node[t].tree[root].sum = 0;
if(l == r)
return;
int mid = (l + r) >> 1;
build1(t,root*2,l,mid);
build1(t,root*2+1,mid+1,r);
}
void insert1(int t,int root,int l,int v)
{
if(node[t].tree[root].left == node[t].tree[root].right)
{
node[t].tree[root].sum += v;
return;
}
int mid = (node[t].tree[root].left + node[t].tree[root].right) >> 1;
if(l <= mid)
insert1(t,root*2,l,v);
else
insert1(t,root*2+1,l,v);
node[t].tree[root].sum = node[t].tree[root*2].sum + node[t].tree[root*2+1].sum;
}
int query1(int t,int root,int l,int r)
{
if(node[t].tree[root].left == node[t].tree[root].right)
return node[t].tree[root].sum;
if(node[t].tree[root].left == l && node[t].tree[root].right == r)
return node[t].tree[root].sum;
int mid = (node[t].tree[root].left + node[t].tree[root].right) >> 1;
if(r <= mid)
return query1(t,root*2,l,r);
else if(l > mid)
return query1(t,root*2+1,l,r);
else
return query1(t,root*2,l,mid) + query1(t,root*2+1,mid+1,r);
}
void build(int root,int l,int r,int x,int y)
{
node[root].left = l;
node[root].right = r;
build1(root,1,x,y);
if(l == r)
return ;
int mid = (l + r) >> 1;
build(root*2,l,mid,x,y);
build(root*2+1,mid+1,r,x,y);
}
void insert(int root,int x,int y,int v)
{
if(node[root].left == node[root].right)
{
insert1(root,1,y,v);
return;
}
int mid = (node[root].left + node[root].right) >> 1;
if(x <= mid)
insert(root*2,x,y,v);
else
insert(root*2+1,x,y,v);
}
int query(int root,int x,int x1,int y,int y1)
{
if(node[root].left == node[root].right)
return query1(root,1,y,y1);
if(node[root].left == x && node[root].right == x1)
return query1(root,1,y,y1);
int mid = (node[root].left + node[root].right) >> 1;
if(x1 <= mid)
return query(root*2,x,x1,y,y1);
else if(x > mid)
return query(root*2+1,x,x1,y,y1);
else
return query(root*2,x,mid,y,y1) + query(root*2+1,mid+1,x1,y,y1);
}
int main(int argc, char** argv)
{
int i,j,x,y,x1,y1,d,val;
while(scanf("%d%d",&d,&n) != EOF)
{
build(1,0,n+1,0,n+1);
while(scanf("%d",&d) && d != 3)
{
if(d == 1)
{
scanf("%d%d%d",&x,&y,&val);
x++;y++;
insert(1,x,y,val);
}
else if(d == 2)
{
scanf("%d%d%d%d",&x,&y,&x1,&y1);
x++;y++;x1++;y1++;
int ans = query(1,x,x1,y,y1);
printf("%d\n",ans);
}
}
}
return (EXIT_SUCCESS);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator