Pagini recente » Cod sursa (job #41708) | Cod sursa (job #1075641) | Cod sursa (job #2252717) | Cod sursa (job #545006) | Cod sursa (job #756315)
Cod sursa(job #756315)
#include <fstream>
using namespace std;
struct TNod;
typedef TNod *PNod;
struct TNod
{
long val;
long left,right,mid;
PNod L,R;
};
long N,M;
long A[100005];
PNod Frunze[100005];
PNod T;
PNod CreazaNod(long left,long right)
{
PNod r = new TNod;
r->left = left;
r->right = right;
r->mid = left + ((right - left) >> 1);
r->L = 0;
r->R = 0;
if (r->left == r->right)
{
r->val = A[left];
Frunze[left] = r;
}
else
{
r->val = -1;
}
return r;
}
PNod ConstruiesteArbore(long left,long right)
{
PNod R = CreazaNod(left,right);
if (R->val < 0)
{
R->L = ConstruiesteArbore(left,R->mid);
R->R = ConstruiesteArbore(R->mid + 1,right);
}
return R;
}
long ComputeSum(PNod r)
{
if (r->val < 0)
{
r->val = ComputeSum(r->L) + ComputeSum(r->R);
}
return r->val;
}
long AflaSum(PNod r,long a,long b)
{
if ((a == r->left) && (b == r->right))
{
return r->val;
}
if (a > r->mid)
{
return AflaSum(r->R,a,b);
}
if (b <= r->mid)
{
return AflaSum(r->L,a,b);
}
if ((r->left <= a) && (b <= r->right))
{
return AflaSum(r->L,a,r->mid) + AflaSum(r->R,r->mid + 1,b);
}
return 0;
}
long UpdateVal(PNod r,long a,long b)
{
if (r->left == r->right)
{
return r->val += b;
}
if (a <= r->mid)
{
UpdateVal(r->L,a,b);
r->val += b;
}
if (a > r->mid)
{
UpdateVal(r->R,a,b);
r->val += b;
}
return 0;
}
long AflaLen(PNod r,long a)
{
if (r->val == a)
{
return r->right;
}
if (r->left == r->right)
{
return -1;
}
if (r->L->val >= a)
{
return AflaLen(r->L,a);
}
else
{
return AflaLen(r->R,a - r->L->val);
}
return 0;
}
int main(void)
{
fstream fin("aib.in",ios::in);
fstream fout("aib.out",ios::out);
long i,op,a,b;
fin >> N >> M;
for (i = 1;i <= N;i += 1)
{
fin >> A[i];
}
T = ConstruiesteArbore(1,N);
ComputeSum(T);
for (i = 0;i < M;i += 1)
{
fin >> op;
switch (op)
{
case 0 :
{
fin >> a >> b;
UpdateVal(T,a,b);
}
break;
case 1 :
{
fin >> a >> b;
fout << AflaSum(T,a,b) << "\n";
}
break;
case 2 :
{
fin >> a;
fout << AflaLen(T,a) << "\n";
}
break;
};
}
fin.close();
fout.close();
return 0;
}