Pagini recente » Cod sursa (job #1283053) | Cod sursa (job #2331879) | Autentificare | Cod sursa (job #1574100) | Cod sursa (job #651625)
Cod sursa(job #651625)
#include <fstream>
#include <iostream>
#define MAXN 100002
using namespace std;
typedef unsigned int uint32;
uint32 tree[MAXN];
void Update(uint32 tree[], const uint32 n, uint32 pos, const uint32 val)
{
while (pos <= n)
{
tree[pos] += val;
pos += (pos & -pos);
}
}
uint32 Query(const uint32 tree[], const uint32 n, uint32 pos)
{
uint32 sum = 0;
while (pos > 0)
{
sum += tree[pos];
pos -= (pos & -pos);
}
return sum;
}
int Search(const uint32 tree[], const uint32 n, uint32 sum)
{
uint32 step=1, i;
while (step <= n)
step <<= 1;
for (i=0; step; step>>=1)
{
if (i+step<=n && sum>=tree[i+step])
{
i += step;
sum -= tree[i];
if (0 == sum)
{
return i;
}
}
}
return -1;
}
int main()
{
int n, m;
fstream fin("aib.in", fstream::in);
fstream fout("aib.out", fstream::out);
fin >> n >> m;
//cout << n << endl;
for (uint32 i=1; i<=n; ++i)
{
uint32 val;
fin >> val;
//cout << val << " ";
Update(tree, n, i, val);
}
//cout << endl;
for (uint32 i=0; i<m; ++i)
{
uint32 opt;
fin >> opt;
switch (opt)
{
case 0:
{
uint32 a,b;
fin>> a >> b;
Update(tree, n, a, b);
}; break;
case 1:
{
uint32 a,b;
fin>> a >> b;
fout << Query(tree, n, b) - Query(tree, n, a-1) << "\n";
}; break;
case 2:
{
uint32 a;
fin >> a;
fout << Search(tree, n, a) << "\n";
}; break;
}
}
fin.close();
fout.close();
return 0;
}