Pagini recente » Cod sursa (job #547359) | Cod sursa (job #639693) | Cod sursa (job #3187095) | Cod sursa (job #8268) | Cod sursa (job #2035082)
#include <iostream>
#include <conio.h>
#include <fstream>
#define DIM 100010
using namespace std;
int n, m;
int aib[DIM];
void Update(int poz, int val)
{
while (poz <= n)
{
aib[poz] += val;
poz += (poz & (-poz));
}
}
int Query1(int poz)
{
int s = 0;
while (poz > 0)
{
s += aib[poz];
poz -= (poz & (-poz));
}
return s;
}
int Query2(int val)
{
int left = 1, right = n, mid, poz = -1;
while (left <= right)
{
mid = (left + right) / 2;
int x = Query1(mid);
if (x == val)
{
poz = mid;
right = mid - 1;
}
else
{
if (x < val)
left = mid + 1;
else
right = mid - 1;
}
}
return poz;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f >> n >> m;
for (int i = 1;i <= n;++i)
{
int x;
f >> x;
Update(i, x);
}
for (int i = 1;i <= m;++i)
{
int id;
f >> id;
switch (id)
{
case 0:
{
int poz, val;
f >> poz >> val;
Update(poz, val);
break;
}
case 1:
{
int left, right;
f >> left >> right;
left = Query1(left - 1);
right = Query1(right);
g << right - left << "\n";
break;
}
case 2:
{
int k;
f >> k;
g << Query2(k) << "\n";
break;
}
}
}
f.close();
g.close();
return 0;
}