-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a54348f
commit c22474b
Showing
12 changed files
with
779 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]<<" "; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} | ||
} | ||
|
Oops, something went wrong.