Pagini recente » Cod sursa (job #899520) | Cod sursa (job #2477682) | Cod sursa (job #1364460) | Cod sursa (job #2727967) | Cod sursa (job #1377063)
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int N = 100001;
int n, m;
int aib[N];
inline int zerou(int x)
{
return ((x ^ (x - 1)) & x);
}
void adauga(int x, int val)
{
for(int i = x; i <= n; i += zerou(i))
aib[i] += val;
}
int calculeaza(int x)
{
int rez = 0;
for(int i = x; i > 0; i -= zerou(i))
rez += aib[i];
return rez;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int val;
in >> val;
adauga(i, val);
}
for(int i = 1; i <= m; i++)
{
int tip, a, b;
in >> tip;
if(tip == 2)
{
in >> a;
int j = 0, pas = 1 << 16;
while(pas)
{
if(j + pas <= n && calculeaza(j + pas) < a)
j += pas;
pas /= 2;
}
j++;
if(calculeaza(j) == a)
out << j << '\n';
else
out << -1 << '\n';
}
else
{
in >> a >> b;
if(tip == 0)
adauga(a, b);
else
out << calculeaza(b) - calculeaza(a - 1) << '\n';
}
}
return 0;
}