In this HackerEarth Binary Modulo P2SME problem solution You are given a Binary String A of length N indexed from 0 to N - 1. You have to perform 2 queries:-
  1. 0 L R - Tell the remainder of the Number(in Decimal) represented by the Binary String between indexes L and R when divided by 5.
  2. 1 X V - Replace character at position X with V.

HackerEarth Binary Modulo <P2SME> problem solution


HackerEarth Binary Modulo <P2SME> problem solution.

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <list>
#include <math.h>

#define ll long long int
#define maxN 10000
#define maxVal 100000000
#define minVal -100000000
#define mod 1000000007LL

#define gcd(a,b) __gcd(a,b)

using namespace std;

struct data
{
int v,c;
};

int p[maxN+5];

int n;
char a[maxN+5];
data tree[3*maxN+5];

void pre()
{
int i;
p[0]=1;
for(i=1;i<=maxN;i++)
p[i]=(2*p[i-1])%5;
}

data makeNode(int v)
{
data x;
x.v=v;
x.c=1;
return x;
}

data combine(data l,data r)
{
data x;
x.v=((l.v*p[r.c])%5+r.v)%5;
x.c=l.c+r.c;
return x;
}

void build(int node,int start,int end)
{
if(start==end)
{
tree[node]=makeNode(a[start]-'0');
return;
}
int mid=start+(end-start)/2;
build(2*node+1,start,mid);
build(2*node+2,mid+1,end);
tree[node]=combine(tree[2*node+1],tree[2*node+2]);
}

data query(int node,int start,int end,int l,int r)
{
if(start>=l&&end<=r)
return tree[node];
int mid=start+(end-start)/2;
if(l>mid)
return query(2*node+2,mid+1,end,l,r);
if(r<=mid)
return query(2*node+1,start,mid,l,r);
return combine(query(2*node+1,start,mid,l,r),query(2*node+2,mid+1,end,l,r));
}

void update(int node,int start,int end,int i,int v)
{
if(start==end)
{
tree[node]=makeNode(v);
return;
}
int mid=start+(end-start)/2;
if(i<=mid)
update(2*node+1,start,mid,i,v);
else
update(2*node+2,mid+1,end,i,v);
tree[node]=combine(tree[2*node+1],tree[2*node+2]);
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t,q,l,r,c;
pre();
scanf("%d",&t);
while(t--)
{
scanf("%s%d",a,&q);
n=strlen(a);
build(0,0,n-1);
while(q--)
{
scanf("%d%d%d",&c,&l,&r);
if(c==0)
printf("%d\n",query(0,0,n-1,l,r).v);
else
update(0,0,n-1,l,r);
}
}
return 0;
}