Pagini recente » Cod sursa (job #739754) | Cod sursa (job #1363016) | Cod sursa (job #2363300) | Cod sursa (job #2358693) | Cod sursa (job #2152464)
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
#define nmax 100005
ifstream f("aib.in");
ofstream g("aib.out");
int n,m;
int aib[nmax];
void update(int valoare,int poz)
{
for (int i=poz; i<=n; i+=(i&(-i)))
aib[i]+=valoare;
}
int querysum(int left,int right)
{
int sum=0;
for (int dr=right; dr; dr-=dr&(-dr))
sum+=aib[dr]; // se aduna sumele partiale din intervalul [1,right]
for (int dr=left-1; dr; dr-=dr&(-dr))
sum-=aib[dr]; // se scad sumele partiale ce apartin intervalului [1,left)
return sum; // suma din intervalul [left,right]
}
int binarysearch(int suma)
{
int left=1,right=n,indice=INT_MAX;
while (left<right)
{
int mid=(left+right)/2;
int cursum=querysum(1,mid);
if (cursum==suma)
{
indice=min(indice,mid);
right=mid;
}
else if (cursum>suma)
right=mid;
else
left=mid+1;
}
if (indice==INT_MAX)
{
if (querysum(1,n)==suma)
return n;
else
return -1;
}
return indice;
}
void read()
{
f>>n>>m;
for (int i=1; i<=n; ++i)
{
int valo;
f>>valo;
update(valo,i);
}
for (int i=1; i<=m; ++i)
{
int typ;
f>>typ;
if (typ==0)
{
int val,poz;
f>>poz>>val;
update(val,poz);
}
else if (typ==1)
{
int righ,lft;
f>>lft>>righ;
g<<querysum(lft,righ)<<'\n';
}
else
{
int summ;
f>>summ;
g<<binarysearch(summ)<<'\n';
}
}
}
int main()
{
read();
return 0;
}