Skip to content

Commit 855c27d

Browse files
authored
Create CSUBQ.cpp
1 parent 30b8310 commit 855c27d

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed

Codechef/NOV17/CSUBQ.cpp

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
#include <bits/stdc++.h>
2+
// #include "stdafx.h"
3+
// #pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS
4+
using namespace std;
5+
#define gc getchar_unlocked
6+
#define fo(i,n) for(i=0;i<n;i++)
7+
#define Fo(i,k,n) for(i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
8+
#define ll long long
9+
#define si(x) scanf("%d",&x)
10+
#define sl(x) scanf("%lld",&x)
11+
#define ss(s) scanf("%s",s)
12+
#define pi(x) printf("%d\n",x)
13+
#define pl(x) printf("%lld\n",x)
14+
#define ps(s) printf("%s\n",s)
15+
#define deb(x) cout << #x << "=" << x << endl
16+
#define deb2(x, y) cout << #x << "=" << x << "," << #y << "=" << y << endl
17+
#define pb push_back
18+
#define mp make_pair
19+
#define F first
20+
#define S second
21+
#define all(x) x.begin(), x.end()
22+
#define clr(x) memset(x, 0, sizeof(x))
23+
#define sortall(x) sort(all(x))
24+
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
25+
#define PI 3.1415926535897932384626
26+
typedef pair<int, int> pii;
27+
typedef pair<ll, ll> pl;
28+
typedef vector<int> vi;
29+
typedef vector<ll> vl;
30+
typedef vector<pii> vpii;
31+
typedef vector<pl> vpl;
32+
typedef vector<vi> vvi;
33+
typedef vector<vl> vvl;
34+
int mpow(int base, int exp);
35+
void ipgraph(int m);
36+
void dfs(int u, int par);
37+
const int mod = 1000000007;
38+
const int N = 2e6, M = N;
39+
//=======================
40+
struct node{
41+
ll ans;
42+
int left, right, len;
43+
void leaf(int val){
44+
ans = left = right = val;
45+
len = 1;
46+
}
47+
48+
void merge(node r, node l){
49+
ans = r.ans + l.ans;
50+
len = r.len + l.len;
51+
52+
ans += l.right * 1LL * r.left;
53+
54+
left = l.left;
55+
right = r.right;
56+
57+
if(l.left == l.len) left += r.left;
58+
if(r.right == r.len) right += l.right;
59+
}
60+
61+
};
62+
class st{
63+
int n;
64+
node* T;
65+
int* a;
66+
public:
67+
#define l(x) 2*x
68+
#define r(x) 2*x+1
69+
#define lpart left, lo, mid
70+
#define rpart right, mid+1, hi
71+
st() {}
72+
st(int x){
73+
a = new int[x];
74+
for(int i = 0; i < x; i++) a[i] = 1;
75+
n = 1;
76+
while(n <= x) n *= 2; n *= 2;
77+
T = new node[n];
78+
n = x;
79+
build(1, 0, n-1);
80+
}
81+
st(int *arr, int x){
82+
a = arr;
83+
n = 1;
84+
while(n <= x) n *= 2; n *= 2;
85+
T = new node[n];
86+
n = x;
87+
build(1, 0, n-1);
88+
}
89+
void build(int id, int lo, int hi){
90+
if(lo == hi){
91+
T[id].leaf(a[lo]);
92+
return;
93+
}
94+
int left = l(id), right = r(id), mid = (lo+hi)/2;
95+
build(lpart);
96+
build(rpart);
97+
T[id].merge(T[left], T[right]);
98+
}
99+
void update(int pos, int val){
100+
update(1, 0, n-1, pos, val);
101+
}
102+
void update(int id, int lo, int hi, int pos, int val){
103+
if(lo==hi and lo==pos){
104+
a[pos] = val;
105+
T[id].leaf(a[lo]);
106+
return;
107+
}
108+
int left = l(id), right = r(id), mid = (lo+hi)/2;
109+
if(pos <= mid) update(lpart, pos, val);
110+
else update(rpart, pos, val);
111+
T[id].merge(T[left], T[right]);
112+
}
113+
ll query(int x, int y){
114+
return query(1, 0, n-1, x, y).ans;
115+
}
116+
node query(int id, int lo, int hi, int x, int y){
117+
if(lo==x and hi==y){
118+
return T[id];
119+
}
120+
int left = l(id), right = r(id), mid = (lo+hi)/2;
121+
if(y <= mid) return query(lpart, x, y);
122+
else if(x>mid) return query(rpart, x, y);
123+
node L = query(lpart, x, mid);
124+
node R = query(rpart, mid+1, y);
125+
node res;
126+
res.merge(L, R);
127+
return res;
128+
}
129+
};
130+
131+
vi g[N];
132+
int a[N];
133+
134+
int main()
135+
{
136+
ios_base::sync_with_stdio(false);
137+
cin.tie(NULL);
138+
int i,n,k,j;
139+
int q, L, R, type, l, r, x, y;
140+
cin >> n >> q >> L >> R;
141+
142+
L--;
143+
144+
st A(n), B(n);
145+
146+
while(q--){
147+
cin >> type >> l >> r;
148+
if(type == 1){
149+
l--;
150+
//a[l] = r;
151+
if(r <= L) A.update(l, 1);
152+
else A.update(l, 0);
153+
154+
if(r <= R) B.update(l, 1);
155+
else B.update(l, 0);
156+
}
157+
else{
158+
l--; r--;
159+
cout << B.query(l, r) - A.query(l, r) << endl;
160+
}
161+
162+
}
163+
return 0;
164+
}
165+
166+
/* INPUT:
167+
5 6 1 10
168+
1 1 2
169+
2 1 5
170+
1 3 11
171+
1 4 3
172+
2 3 5
173+
2 1 5
174+
*/

0 commit comments

Comments
 (0)