Pagini recente » Rating Drelciuc Alex (ROGrinder) | Cod sursa (job #2058598) | Istoria paginii runda/f13-training | Istoria paginii runda/pregatire-lot-aib/clasament | Cod sursa (job #1363956)
#include <fstream>
#define zeros(x)((x ^ (x - 1)) & x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int N = 100001;
int n, m;
int aib[N];
void adauga(int x, int val)
{
int i;
for(i = x; i <= n; i += zeros(i))
aib[i] += val;
}
int calculeaza(int x)
{
int i, ret = 0;
for(i = x; i > 0; i -= zeros(i))
ret += aib[i];
return ret;
}
int interogare(int a, int b)
{
return calculeaza(b) - calculeaza(a - 1);
}
void citire()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int val;
in >> val;
adauga(i, val);
}
}
int main()
{
citire();
for(int i = 1 ; i <= m; i++)
{
int tip;
in >> tip;
if(tip == 2)
{
int a;
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
{
int a, b;
in >> a >> b;
if(tip == 0)
adauga(a, b);
else
out << interogare(a, b) << '\n';
}
}
return 0;
}