Pagini recente » Cod sursa (job #2881578) | Cod sursa (job #517356) | Cod sursa (job #1631686) | Cod sursa (job #2864779) | Cod sursa (job #3161163)
#include<bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100005];
int n, q;
int lsb(int x)
{
return (~x + 1) & x;
}
void q1(int a, int b)
{
int j = a;
while ( j <= n )
{
aib[j] += b;
j += lsb(j);
}
}
int suma(int a)
{
int j = a;
int ans = 0;
while ( j > 0 )
{
ans += aib[j];
j -= lsb(j);
}
return ans;
}
int q2(int a, int b)
{
return suma(b) - suma(a-1);
}
int q3(int x)
{
int st = 1;
int dr = n;
int ans = -1;
while ( st <= dr )
{
int mij = ( st + dr ) / 2;
int aux = suma(mij);
if ( aux == x )
return mij;
if ( aux > x )
dr = mij - 1;
else
st = mij + 1;
}
return -1;
}
void citire()
{
in>>n>>q;
for ( int i = 1 ; i <= n ; i++ )
{
int x;
in>>x;
q1(i, x);
}
}
void rez()
{
for ( int i = 1 ; i <= q ; i++ )
{
int op;
in>>op;
if ( op == 0 )
{
int a, b;
in>>a>>b;
q1(a, b);
}
else if ( op == 1 )
{
int a, b;
in>>a>>b;
out<<q2(a, b)<<'\n';
}
else
{
int a;
in>>a;
out<<q3(a)<<'\n';
}
}
}
int main()
{
citire();
rez();
return 0;
}