Pagini recente » Cod sursa (job #2568341) | Cod sursa (job #2626928) | Cod sursa (job #2357517) | Cod sursa (job #1664016) | Cod sursa (job #2528935)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int tree[100005],n;
void addvalue(int index,int val)
{
for (int i=index;i<=n;i=i+(i&(-i)))
tree[i]+=val;
}
int calcularesuma(int a,int b)
{
int suma1a=0,suma1b=0;
for (int i=b;i>=1;i=i-(i&(-i)))
suma1b+=tree[i];
for (int i=a-1;i>=1;i=i-(i&(-i)))
suma1a+=tree[i];
return suma1b-suma1a;
}
int pozmink(int a)
{
int st=1,dr=min(a,n);
while(st<=dr)
{
int mij=(st+dr)/2;
int val=calcularesuma(1, mij);
if (val==a)
return mij;
else if (val>a)
dr=mij-1;
else if (val<a)
st=mij+1;
}
return -1;
}
int main()
{
int m;
fin>>n>>m;
for (int i=1;i<=n;i++)
{
int x;
fin>>x;
addvalue(i, x);
}
for (int i=1;i<=m;i++)
{
char c;
fin>>c;
switch(c)
{
case('0'):
{
int x,y;
fin>>x>>y;
addvalue(x, y);
break;
}
case('1'):
{
int x,y;
fin>>x>>y;
fout<<calcularesuma(x, y)<<'\n';
break;
}
case('2'):
{
int x;
fin>>x;
fout<<pozmink(x)<<'\n';
break;
}
}
}
return 0;
}