Skip to content

Commit

Permalink
added range queries solutions
Browse files Browse the repository at this point in the history
  • Loading branch information
Code-N-Code committed Jan 29, 2022
1 parent a54348f commit c22474b
Show file tree
Hide file tree
Showing 12 changed files with 779 additions and 0 deletions.
72 changes: 72 additions & 0 deletions Range Queries/Dynamic Range Minimum Queries.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 2000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int N = 200001;
lli ar[N];
lli st[4*N];

int build(int si , int ss , int se)
{
if(ss == se) return st[si] = ar[ss];

int mid = (ss + se) >> 1;

return st[si] = min(build(2*si , ss , mid) , build(2*si+1 , mid+1 , se));
}

void update(int si , int ss , int se , int idx , lli value)
{
if(idx > se || idx < ss) return;

if(ss == se && ss == idx){
st[si] = value;
return;
}

int mid = (ss + se) >> 1;
update(2*si , ss , mid , idx , value);
update(2*si+1 , mid+1 , se , idx , value);
st[si] = min(st[2*si] , st[2*si+1]);
}

int getMin(int si , int ss , int se , int l , int r)
{
if(l > se || r < ss) return INF;

if(ss >= l && se <= r) return st[si];

int mid = (ss + se) >> 1;
return min(getMin(2*si , ss , mid , l , r) , getMin(2*si+1 , mid+1 , se , l , r));
}

int main()
{
int n , q , a , b;
cin>>n>>q;

REP(i , n) cin>>ar[i];

build(1 , 1 , n);
while(q--)
{
int code;
cin>>code>>a>>b;
if(code == 1) update(1 , 1 , n , a , b);
else cout<<getMin(1 , 1 , n , a , b)<<endl;
}
}

74 changes: 74 additions & 0 deletions Range Queries/Dynamic Range Sum Queries.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//video solution link : https://www.youtube.com/watch?v=r-fJF9D2Fg0&list=PL2q4fbVm1Ik7RiRG7KnHjxmblwFEGfVdR&index=5

#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 2000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int N = 200001;
lli ar[N];
lli st[4*N];

lli build(int si , int ss , int se)
{
if(ss == se) return st[si] = ar[ss];

int mid = (ss + se) >> 1;

return st[si] = build(2*si , ss , mid) + build(2*si+1 , mid+1 , se);
}

void update(int si , int ss , int se , int idx , lli value)
{
if(idx > se || idx < ss) return;

if(ss == se && ss == idx){
st[si] += value;
return;
}

int mid = (ss + se) >> 1;
update(2*si , ss , mid , idx , value);
update(2*si+1 , mid+1 , se , idx , value);
st[si] = st[2*si] + st[2*si+1];
}

lli getSum(int si , int ss , int se , int l , int r)
{
if(l > se || r < ss) return 0;

if(ss >= l && se <= r) return st[si];

int mid = (ss + se) >> 1;
return getSum(2*si , ss , mid , l , r) + getSum(2*si+1 , mid+1 , se , l , r);
}

int main()
{
int n , q , a , b;
cin>>n>>q;

REP(i , n) cin>>ar[i];

build(1 , 1 , n);
while(q--)
{
int code;
cin>>code>>a>>b;
if(code == 1) update(1 , 1 , n , a , b - ar[a]) , ar[a] = b;
else cout<<getSum(1 , 1 , n , a , b)<<endl;
}
}

41 changes: 41 additions & 0 deletions Range Queries/Forest Queries.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//video solution link : https://www.youtube.com/watch?v=ONDFFcD6GXc&list=PL2q4fbVm1Ik7RiRG7KnHjxmblwFEGfVdR&index=3

#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int N = 1001;
lli ar[N][N];

lli getAns(int sx , int sy , int ex , int ey)
{
return ar[ex][ey] - ar[sx-1][ey] - ar[ex][sy-1] + ar[sx-1][sy-1];
}
int main()
{
int n , q;
int a , b , c , d;
char ch;

cin>>n>>q;

REP(i , n) REP(j , n) cin>>ch , ar[i][j] = ch =='*' , ar[i][j] += ar[i][j-1];
REP(i , n) REP(j , n) ar[i][j] += ar[i-1][j];

while(q--)
cin>>a>>b>>c>>d , cout<<getAns(a , b , c , d)<<endl;
}

62 changes: 62 additions & 0 deletions Range Queries/Hotel Queries.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int MAXN = 200001;

int n;
int segtree[4 * MAXN], a[MAXN];

void build(int l = 1, int r = n, int node = 1) {
if (l == r) segtree[node] = a[l];
else {
int mid = (l + r) / 2;
build(l, mid, node * 2);
build(mid + 1, r, node * 2 + 1);
segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
}

void queryupdate(int val, int l = 1, int r = n, int node = 1) {
if (l == r) {
segtree[node] -= val;
cout << l << ' ';
} else {
int mid = (l + r) / 2;
if (segtree[node * 2] >= val) queryupdate(val, l, mid, node * 2);
else queryupdate(val, mid + 1, r, node * 2 + 1);

segtree[node] = max(segtree[node * 2], segtree[node * 2 + 1]);
}
}

int main() {
iostream::sync_with_stdio(false);
cin.tie(0);
int q;
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
build();

while (q--) {
int x;
cin >> x;
if (segtree[1] < x) cout << "0 ";
else queryupdate(x);
}
return 0;
}

63 changes: 63 additions & 0 deletions Range Queries/List Removals.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

const int N = 200001;

int st[4*N];
int ar[N];
int res;

int build(int si , int ss ,int se)
{
if(ss == se) return st[si] = 1;

int mid = (ss + se) / 2;
return st[si] = build(2*si , ss , mid) + build(2*si + 1, mid + 1 , se);
}

void update(int si , int ss , int se , int val)
{
if(ss == se)
{
res = ss;
st[si] = 0;
return;
}

int mid = (ss + se) / 2;
if(st[2*si] >= val) update(2*si , ss , mid , val);
else update(2*si + 1 , mid + 1 , se , val - st[2*si]);

st[si] = st[2*si] + st[2*si+1];
}

int main()
{
int n , a;
cin>>n;
REP(i , n) cin>>ar[i];

build(1 , 1 , n);

REP(i , n)
{
cin>>a;
update(1 , 1 , n , a);
cout<<ar[res]<<" ";
}
}

74 changes: 74 additions & 0 deletions Range Queries/Pizzeria Queries.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include<bits/stdc++.h>
#define ll long long int
using namespace std;

const int N = 2e5;
const int INF = 1e9;
int ar[N+1];
int pre[4*N] , suff[4*N];

void build(int si , int ss , int se){
if(ss == se){
pre[si] = ar[ss] - ss;
suff[si] = ar[ss] + ss;
return;
}

int mid = (ss + se) / 2;
build(2*si , ss , mid);
build(2*si + 1 , mid + 1 , se);
pre[si] = min(pre[2*si] , pre[2*si+1]);
suff[si] = min(suff[2*si] , suff[2*si+1]);
}

void update(int si , int ss , int se , int qi , int val){
if(ss > qi || se < qi) return;

if(ss == se && ss == qi){
ar[ss] = val;
pre[si] = val - ss;
suff[si] = val + ss;
return;
}

int mid = (ss + se) / 2;
update(2*si , ss , mid , qi , val);
update(2*si+1 , mid+1 , se , qi , val);
pre[si] = min(pre[2*si] , pre[2*si+1]);
suff[si] = min(suff[2*si] , suff[2*si+1]);
}

int getMin(int si , int ss , int se , int qs , int qe , int st[]){
if(ss > qe || se < qs) return INF;

if(ss>=qs && se<=qe) return st[si];

int mid = (ss + se) / 2;

return min(getMin(2*si , ss , mid , qs , qe , st) ,
getMin(2*si+1 , mid+1 , se , qs , qe , st));
}

int main(){
int n , q;
int code , a , b;

cin>>n>>q;
for(int i=1;i<=n;i++) cin>>ar[i];
build(1 , 1 , n);

while(q--){
cin>>code;
if(code == 1){
cin>>a>>b;
update(1 , 1 , n , a , b);
}
else{
cin>>a;
int L = getMin(1 , 1 , n , 1 , a , pre) + a;
int R = getMin(1 , 1 , n , a , n , suff) - a;
cout<<min(L , R)<<endl;
}
}
}

Loading

0 comments on commit c22474b

Please sign in to comment.