Pagini recente » Cod sursa (job #1575395) | Cod sursa (job #149615) | Cod sursa (job #251720) | Cod sursa (job #2200436) | Cod sursa (job #3261336)
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int NMAX = 100000;
int v[NMAX + 5], aib[NMAX + 5];
int n;
int lsb(int k)
{
return (k&(-k));
}
void update(int pozitie, int element)
{
///adaug elementul pe pozitia pozitie
int rez = pozitie;
while(rez <= n)
{
aib[rez] += element;
rez += lsb(rez);
}
}
int q(int k)
{
///suma nr de la 1 la k
int suma = 0, curent;
curent = k;
while(curent >= 1)
{
suma += aib[curent];
curent -= lsb(curent);
}
return suma;
}
int poz_minima(int a)
{
int st = 1, dr = n;
int m;
while(st <= dr)
{
m = (st + dr)/2;
if(q(m) < a)
{
st = m + 1;
}
else
{
if(q(m) > a)
{
dr = m - 1;
}
else
{
///q(m) == a
return m;
}
}
}
return -1;
}
int main()
{
int m, i, c, a, b;
f >> n >> m;
for(i = 1; i <= n; ++i)
{
f >> v[i];
update(i, v[i]);
}
for(i = 1; i <= m; ++i)
{
f >> c;
if(c == 0)
{
f >> a >> b;
update(a, b);
}
if(c == 1)
{
f >> a >> b;
g << (q(b) - q(a-1)) << "\n";
}
if(c == 2)
{
f >> a;
g << poz_minima(a) << "\n";
}
}
return 0;
}