Pagini recente » Cod sursa (job #1925044) | Cod sursa (job #2373536) | Cod sursa (job #2033271) | Cod sursa (job #60007) | Cod sursa (job #2457042)
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
const int NMAX = 100000;
int N, AiB[NMAX + 1];
ifstream f("aib.in");
ofstream g("aib.out");
void add(int poz, int val)
{
while(poz <= N)
{
AiB[poz] += val;
poz += poz & (-poz);
}
}
int sum(int poz)
{
int s = 0;
while(poz > 0)
{
s += AiB[poz];
poz -= poz & (-poz);
}
return s;
}
int bsearch(int val)
{
int p = 1, u = N, poz = -1;
while(p <= u)
{
int m = (p + u) >> 1;
int s = sum(m);
if(s < val)
p = m + 1;
else
{
if(s == val)
poz = m;
u = m - 1;
}
}
return poz;
}
void afis()
{
int i;
for(i = 1; i <= N; i++)
cout << setw(4) << i;
cout << '\n';
for(i = 1; i <= N; i++)
cout << setw(4) << AiB[i];
cout << '\n' << '\n';
}
int main()
{
int M, op, x, y;
f >> N >> M;
for(int i = 1; i <= N; i++)
{
f >> x;
add(i, x);
//afis();
}
//
while(M--)
{
f >> op;
switch(op)
{
case 0:
f >> x >> y;
add(x, y);
break;
case 1:
f >> x >> y;
g << sum(y) - sum(x - 1) << '\n';
break;
case 2:
f >> x;
g << bsearch(x) << '\n';
}
}
return 0;
}