Pagini recente » Cod sursa (job #173580) | Cod sursa (job #253143) | Cod sursa (job #144677) | Cod sursa (job #2572663) | Cod sursa (job #1362729)
#include <fstream>
#include <string.h>
using namespace std;
ifstream f1("aib.in");
ofstream f2("aib.out");
#define N 100*1001
#define DIF (x&(x^(x-1)))
int m;
class AIB
{
int n;
int v[N];
int caut_bin(int st, int dr, int a);
public:
void read();
void update(int poz, int val);
int sum(int st, int dr);
int caut_poz(int a);
};
void AIB::read()
{
f1>>n>>m;
int i,a;
memset(v, 0, sizeof(v));
for (i=1; i<=n; i++)
{
f1>>a;
update(i,a);
}
}
void AIB::update(int poz, int val)
{
for (int x=poz; x<=n; x+= DIF )
v[x]+=val;
}
int AIB::sum(int st, int dr)
{
int sm=0, x;
for ( x= dr; x >= 1; x-= DIF )
sm+=v[x];
for ( x=st-1; x >= 1; x-= DIF )
sm-=v[x];
return sm;
}
int AIB::caut_bin(int st, int dr, int a)
{
if (st>=dr)
{
if ( sum(1,dr) == a ) return st;
else return -1;
}
int m=(st+dr)/2;
if ( a <= sum(1,m) ) return caut_bin(st, m, a);
else return caut_bin(m+1, dr, a);
}
int AIB::caut_poz(int a)
{
return caut_bin(1,n,a);
}
int main()
{
AIB a1;
a1.read();
int cod, a, b ;
for (int i=1; i<=m; i++)
{
f1>>cod;
if ( cod == 0 )
{
f1>>a>>b;
a1.update(a,b);
}
if ( cod == 1 )
{
f1>>a>>b;
f2<<a1.sum(a,b)<<"\n";
}
if ( cod == 2 )
{
f1>>a;
f2<<a1.caut_poz(a)<<"\n";
}
}
f2.close();
return 0;
}