Pagini recente » Cod sursa (job #755711) | Cod sursa (job #3256800) | Cod sursa (job #1631079) | Cod sursa (job #1314047) | Cod sursa (job #1467289)
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#include <string>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <limits.h>
#include <algorithm>
#include <deque>
#define nmax 100010
#define mod 1999999973
using namespace std;
int n,m,aib[nmax],tip,i,j,x,y,st,dr,mm,sol,b;
inline int lsb(int x) { return (x&(-x)); }
void update(int i,int x)
{
for (;i<=n;i+=lsb(i)) aib[i]+=x;
}
int query(int i)
{
int sum=0;
for (;i>0;i-=lsb(i)) sum=sum+aib[i];
return sum;
}
int main() {
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=n;i++) {
scanf("%d",&x); update(i,x);
}
for (i=1;i<=m;i++) {
scanf("%d",&tip);
if (tip==0) { scanf("%d %d",&x,&y); update(x,y); } else
if (tip==1) { scanf("%d %d",&x,&y); printf("%d\n",query(y)-query(x-1)); } else
{
scanf("%d",&x); st=1; dr=n; sol=-1;
while (st<=dr) {
mm=(st+dr)/2; b=query(mm);
if (b==x) sol=mm,dr=mm-1;
if (b>x) dr=mm-1; else st=mm+1;
}
printf("%d\n",mm);
}
}
return 0;
}