0
競合コーディングの問題のセグメントツリーを作成しようとしていますが、このツリーは配列を使って表現されています。私はrangeMinQueryとupdateTreeという関数を持っています。これらの関数は配列上で中間のジョブを実行します。私は関数を使って前記配列を操作する方法を理解することができません。Cプログラムのすべての関数で配列にアクセスするには?
#include <stdio.h>
#include <stdlib.h>
#define bool int
#define MAX(a,b) (((a)>(b))?(a):(b))
int upper_power_of_two(int v)
{
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
return v;
}
int getMid(int s, int e)
{
return s + (e -s)/2;
}
void updateValueUtil(int segTree[], int ss, int se, int i, int diff, int si)
{
// Base Case: If the input index lies outside the range of
// this segment
if (i < ss || i > se)
return;
// If the input index is in range of this node, then update
// the value of the node and its children
st[si] = st[si] + diff;
if (se != ss)
{
int mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i, diff, 2*si + 1);
updateValueUtil(st, mid+1, se, i, diff, 2*si + 2);
}
}
void updateValue(int arr[], int segTree[], int n, int i, int new_val)
{
// Get the difference between new value and old value
int diff = new_val - arr[i];
// Update the value in array
arr[i] = new_val;
// Update the values of nodes in segment tree
updateValueUtil(st, 0, n-1, i, diff, 0);
}
int rangeMinquery(int segTree[],int qlow,int qhigh,int low,int high,int pos)
{
if(qlow<=low && qhigh >=high)
return segTree[pos];
if(qlow>high || qhigh <low)
return 9999999999;
int mid=(low+high)/2;
return MAX(rangeMinquery(segTree,qlow,qhigh,low,mid,2*pos+1),rangeMinquery(segTree,qlow,qhigh,mid+1,high,2*pos+2));
}
int main()
{
int n,q,x,l,r,i;
scanf("%d %d %d %d",&n,&q,&l,&r);
int a[n];
int segTree[upper_power_of_two(n)];
printf("%d\n",upper_power_of_two(n));
while(q--)
{
int cmd,pos1,pos2;
scanf("%d %d %d",&cmd,&pos1,&pos2);
if(cmd==1)
{
a[pos1]+=pos2;
updateValue(a,segTree,n,1,0);
}
if(cmd==2)
{
x=rangeMinquery(segTree,pos1,pos2,0,n,0);
printf("%d\n",x);
}
}
return 0;
}
あなたが見ることができるように、私は配列segTreeを操作し、そこに値そのものを保持しようとしています。おそらく、Javaで同じことを達成する方法があるかどうかを知りたいのですが?
C ['bool'型](http://en.cppreference.com/w/c/types/boolean)、' #include 'とあなたのマクロの代わりに使用してください。 –
ありがとうございます。私はそれをします:) –
'return MAX(rangeMinquery(segTree、...')**多くの関数呼び出しを引き起こします... – wildplasser