Pagini recente » Monitorul de evaluare | Cod sursa (job #2391653) | Cod sursa (job #3166918) | Cod sursa (job #1625019) | Cod sursa (job #1355461)
#include <fstream>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <utility>
#include <string>
#include <cstring>
#include <cstdlib>
#include <bitset>
#include <set>
#include <utility>
#include <vector>
#include <utility>
#include <tr1/unordered_map>
#define mp make_pair
#define pb push_back
#define oo 0x3f3f3f3f
#define f first
#define s second
#define dim 100009
using namespace std;
ofstream out("aib.out");
ifstream in("aib.in");
int n , arb[dim] , m;
inline int lsb( int x )
{
return x & -x;
}
void Read();
void update( int poz , int elem );
int sum( int poz );
void cauta( int suma );
void Solve();
int main()
{
Read();
Solve();
return 0;
}
void Read()
{
in >> n >> m;
for( int i = 1 ; i<=n ; i++)
{
int x;
in >> x;
update(i,x);
}
}
void update(int indice , int elem)
{
for( int i = indice ; i<=n ; i+=lsb(i))
arb[i]+=elem;
}
int sum(int indice)
{
int S = 0;
for( int i = indice ; i >= 1 ; i-=lsb(i))
S+=arb[i];
return S;
}
void cauta(int suma)
{
int i_m = 1 << n;
bool ok = 1;
int j = 0;
while( ok && i_m > 0 )
{
if( i_m + j <=n ) // ma incadrez in aib
{
if( suma >= arb[i_m+j] )
{
j = i_m + j;
suma = suma - arb[j];
if(!suma)
ok = 0;
}
}
i_m >>= 1;
}
if( !ok )
out << j << '\n';
else
out << -1 << '\n';
}
void Solve()
{
for( int tip , x , y ; m ; --m )
{
in >> tip ;
if( tip == 0 )
{
in >> x >> y;
update(x,y);
}
else
if( tip == 1 )
{
in >> x >> y;
int sumy , sumx;
sumy = sum(y);
sumx = sum(x-1);
out << sumy - sumx << '\n';
}
else
if ( tip == 2 )
{
in >> x;
cauta(x);
}
}
}