Pagini recente » Cod sursa (job #2007110) | Cod sursa (job #193097) | Cod sursa (job #1849555) | Cod sursa (job #616833) | Cod sursa (job #2853096)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
int n,c,a,b,m;
int arbore[100001];
int nr_de_zerouri(int x)
{
return x&(-x);
}
void adaugare(int nr,int indice)
{
for(int i = indice; i<=n; i+=nr_de_zerouri(i))
{
arbore[i]+=nr;
}
}
int suma(int indice)
{
int s = 0;
for(int i = indice; i>=1; i-=nr_de_zerouri(i))
{
s+=arbore[i];
}
return s;
}
void citire()
{
f >> n >> m;
int x;
for(int i = 1; i<=n; i++)
{
f >> x;
adaugare(x,i);
}
}
int cb(int a)
{
int st = 1,dr = n,mij;
int rasp = -1;
while(st<=dr)
{
mij= (st+dr)/2;
if(suma(mij) == a)
{
rasp = mij;
dr = mij-1;
}
else if(suma(mij)>a)
{
dr = mij-1;
}
else
st = mij+1;
}
return rasp;
}
int main()
{
citire();
for(int i = 1; i<=m; i++)
{
f >> c;
if(c == 0)
{
f>> a >> b;
adaugare(b,a);
}
if(c == 1)
{
f>> a >> b;
g << suma(b) - suma(a-1)<< '\n';
}
if(c == 2)
{
f>> a;
g << cb(a)<< '\n';
}
}
}