Pagini recente » Cod sursa (job #1242551) | Cod sursa (job #1512675) | Cod sursa (job #1254198) | Cod sursa (job #1593455) | Cod sursa (job #968615)
Cod sursa(job #968615)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int N = 100005;
int n, m;
vector <int> arb(N, 0);
void Plus(int poz, int val)
{
while(poz <= n)
{
arb[poz] += val;
poz += (poz^(poz-1)) & poz;
}
}
int Sum(int poz)
{
int s = 0;
while(poz)
{
s += arb[poz];
poz -= (poz^(poz-1)) & poz;
}
return s;
}
int Cb(int x)
{
int st = 0, dr = n, m, val;
while(dr - st > 1)
{
m = (dr + st) >> 1;
val = Sum(m);
if(val == x) return m;
if(val < x) st = m;
else dr = m;
}
if(Sum(dr) == x) return dr;
return -1;
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
{
int x;
fin>>x;
Plus(i, x);
}
while(m--)
{
int cod, a, b;
fin>>cod;
if(!cod)
{
fin>>a>>b;
Plus(a, b);
}
else if(cod == 1)
{
fin>>a>>b;
fout<<Sum(b) - Sum(a-1)<<'\n';
}
else
{
fin>>a;
fout<<Cb(a)<<'\n';
}
}
return 0;
}