1.G - Xenia and Bit Operations
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lson root << 1
#define rson root <<1|1
const ll MAXN = 1<<17;
ll input[MAXN];
struct Node
{
ll l, r ;
ll val, lazy;
} tr[6*MAXN];
void Build_Tree(ll root , ll l , ll r , ll cur)
{
tr[root].l = l, tr[root].r = r;
if(l==r)
{
tr[root].val = input[l];
return;
}
int mid = (l + r) >> 1;
Build_Tree(lson, l, mid , cur-1);
Build_Tree(rson, mid + 1, r , cur-1);
if(cur&1)
{
tr[root].val = tr[lson].val | tr[rson].val;
}
else
{
tr[root].val = tr[lson].val ^ tr[rson].val;
}
}
void Insert(ll root , ll loc , ll x , ll cur)
{
if(tr[root].l == tr[root].r)
{
tr[root].val = x;
return ;
}
ll mid = (tr[root].l + tr[root].r)>>1;
if(loc <= mid) Insert(lson , loc , x , cur-1);
else Insert(rson , loc , x , cur-1);
if(cur&1)
{
tr[root].val = tr[lson].val | tr[rson].val;
}
else
{
tr[root].val = tr[lson].val ^ tr[rson].val;
}
}
int main()
{
ll n, m;
scanf("%lld%lld", &n, &m);
ll nn = pow(2,n);
for (ll i = 1; i <= nn; ++i)
{
scanf("%lld", &input[i]);
}
Build_Tree(1, 1, nn , n);
for(ll i=1 ; i<=m ; ++i)
{
ll loc ,x;
scanf("%lld%lld",&loc,&x);
Insert(1 , loc , x , n);
cout<<tr[1].val<<endl;
}
}
2、K - The Child and Sequence
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
#define lson root << 1
#define rson root <<1|1
const ll MAXN = 1e5+3;
ll input[MAXN];
struct BTNode
{
ll l, r , val , lazy;
} tr[6*MAXN];
inline void Push_up(ll root)
{
tr[root].val = tr[lson].val + tr[rson].val;
tr[root].lazy = max(tr[lson].lazy , tr[rson].lazy);
}
void Build_Tree(ll root , ll l , ll r)
{
tr[root].l = l, tr[root].r = r;
if(l==r)
{
tr[root].val = input[l];
tr[root].lazy = input[l];
return;
}
ll mid = (l + r) >> 1;
Build_Tree(lson, l, mid);
Build_Tree(rson, mid + 1, r);
Push_up(root);
}
void Point_change(ll root, ll dis, ll val )
{
if(tr[root].l==tr[root].r)
{
tr[root].val = val;
tr[root].lazy = val;
return;
}
ll mid = (tr[root].l + tr[root].r) >> 1;
if(mid>=dis) Point_change(lson, dis, val);
else Point_change(rson, dis, val);
Push_up(root);
}
void Segment_Mod(ll root , ll L , ll R , ll mod)
{
if(L<=tr[root].l && tr[root].r<=R)
{
if(tr[root].lazy < mod) return ;
if(tr[root].l == tr[root].r)
{
tr[root].val %= mod;
tr[root].lazy = tr[root].val;
return;
}
}
ll mid = (tr[root].l + tr[root].r) >>1;
if(L<=mid) Segment_Mod(lson,L,R,mod);
if(mid<R) Segment_Mod(rson,L,R,mod);
Push_up(root);
}
ll Segment_Query(ll root , ll L , ll R)
{
if(L<=tr[root].l && tr[root].r <=R)
{
return tr[root].val;
}
ll mid = (tr[root].l + tr[root].r) >> 1;
ll sum =0 ;
// if(mid>=r)
// return Segment_Query(lson, l, r);
// else if(mid<l)
// return Segment_Query(rson, l, r);
// else return Segment_Query(lson,l,mid)+Segment_Query(rson,mid+1,r);
if(L<=mid) sum += Segment_Query(lson,L,R);
if(mid<R) sum += Segment_Query(rson,L,R);
return sum;
}
int main()
{
ll n, m;
scanf("%lld%lld", &n, &m);
for (ll i = 1; i <= n; ++i)
{
scanf("%lld", &input[i]);
}
Build_Tree(1, 1, n);
for (ll i = 1; i <= m; ++i)
{
ll flag;
scanf("%lld", &flag);
if(flag==1)
{
ll x, y;
scanf("%lld%lld", &x, &y);
printf("%lld\n", Segment_Query(1, x, y));
}
else if(flag==2)
{
ll x, y ,z;
scanf("%lld%lld%lld", &x, &y , &z);
Segment_Mod(1,x,y,z);
}
else if(flag==3)
{
ll loc , x;
scanf("%lld%lld",&loc , &x);
Point_change(1,loc,x);
}
//Print();
}
}
3.M - Can you answer these queries
#include <bits/stdc++.h>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
typedef long long ll;
const int MAXN = 1e5 +5 ;
struct BTNODE
{
ll l , r , val , lazy;
bool is;
}tr[MAXN<<2];
ll input[MAXN];
inline void Push_up(ll rt)
{
tr[rt].val = tr[lson].val + tr[rson].val;
tr[rt].is = tr[lson].is && tr[rson].is ;
}
void Build(ll rt , ll l , ll r)
{
tr[rt].l = l ;
tr[rt].r = r ;
if(l==r)
{
tr[rt].val = input[l];
tr[rt].is = 0;
return ;
}
ll mid = (l+r)>>1;
Build(lson,l,mid);
Build(rson,mid+1,r);
Push_up(rt);
}
void Update(ll rt , ll L , ll R)
{
if(tr[rt].is) return ;
if(tr[rt].l == tr[rt].r)
{
tr[rt].val = sqrt(tr[rt].val);
if(tr[rt].val==1) tr[rt].is = 1;
return ;
}
ll mid = (tr[rt].l + tr[rt].r)>>1;
if(L<=mid) Update(lson,L,R);
if(mid<R) Update(rson,L,R);
Push_up(rt);
}
ll Segment_query(ll rt , ll L , ll R)
{
if(L<=tr[rt].l && tr[rt].r<=R)
{
return tr[rt].val;
}
ll mid = (tr[rt].l + tr[rt].r)>>1;
ll sum =0;
if(L<=mid) sum += Segment_query(lson,L,R);
if(mid<R) sum += Segment_query(rson ,L,R);
return sum;
}
int main()
{
int n , m ;
int flag=0;
while(cin>>n)
{
for(int i=1 ; i<=n ; ++i)
{
cin>>input[i];
}
Build(1,1,n);
scanf("%lld",&m);
printf("Case #%d:\n",++flag);
while(m--)
{
ll k , l ,r;
scanf("%lld%lld%lld",&k,&l,&r);
if(l>r) swap(l,r);
if(k==0) Update(1,l,r);
else printf("%lld\n", Segment_query(1,l,r));
}
printf("\n");
}
}