Pagini recente » Cod sursa (job #2376492) | Cod sursa (job #2051624) | Cod sursa (job #1417249) | Cod sursa (job #3003356) | Cod sursa (job #1244926)
#include <fstream>
using namespace std;
int t[100001];
ifstream fin("aib.in");
ofstream fout("aib.out");
int LSB(int x)
{
return x&(x - 1) ^ x;
}
int MSB(int x)
{
int aux = 1;
while (x!=0)
{
x>>= 1;
aux <<= 1;
}
return aux >> 1;
}
void increment(int p, int val,int n)
{
while (p <= n)
{
t[p] += val;
p += LSB(p);
}
}
/*void init(int n)
{
for (int i = 1; i <= n; i++)
{
t[i] = 0;
}
for (int i = 1; i <= n; i++)
{
t[i] += a[i];
int k = i+ bit(i);
while (k <= n)
{
t[k] += a[i];
k += bit(k);
}
}
}*/
int sum(int i, int sf)
{
if (i != 1)
return sum(1, sf) - sum(1, i - 1);
int s =0;
while (sf != 0)
{
s += t[sf];
sf -= LSB(sf);
}
return s;
}
int posk(int s,int n)
{
int min=-1;
int lo = 1; int hi = n;
while (hi - lo > 1)
{
int mid = (lo + hi)/2;
int aux = sum(1, mid);
if (aux == s)
{
min = mid;
}
if (aux >= s)
hi = mid-1;
else
lo = mid+1;
}
if (sum(1, hi) == s && ((min >= hi) || (min == -1)))
min = hi;
return min;
}
int main()
{
int n;
int m;
fin >> n>>m;
for (int i = 1; i <= n; i++)
{
int aux;
fin >> aux;
increment(i, aux, n);
}
for (int i = 1; i <= m; i++)
{
int aux;
fin >> aux;
if (aux == 0)
{
int poz; int x;
fin >> poz >> x;
increment(poz, x,n);
}
if (aux == 1)
{
int inc; int sf;
fin >> inc >> sf;
fout << sum(inc, sf) << '\n';
}
if (aux == 2)
{
int k;
fin >> k;
fout <<posk(k,n)<<'\n';
}
}
}