1 #include<algorithm>
2 #include<iostream>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cstdio>
6 #include<string>
7 #include<cmath>
8 #include<ctime>
9 #include<queue>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
15 #define Clear(a,b) memset(a,b,sizeof(a))
16 #define inout(x) printf("%d",(x))
17 #define douin(x) scanf("%lf",&x)
18 #define strin(x) scanf("%s",(x))
19 #define LLin(x) scanf("%lld",&x)
20 #define op operator
21 #define CSC main
22 typedef unsigned long long ULL;
23 typedef const int cint;
24 typedef long long LL;
25 using namespace std;
26 void inin(int &ret)
27 {
28 ret=0;int f=0;char ch=getchar();
29 while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
30 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
31 ret=f?-ret:ret;
32 }
33 namespace iceset
34 {
35 int fa[100010],n;
36 void init(){re(i,1,n)fa[i]=i;}
37 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
38 void merge(int l,int r){fa[find(l)]=fa[find(r)];}
39 }
40 namespace heap
41 {
42 int w[100010],ch[100010][2];
43 int root,ed;
44 int merge(int l,int r)
45 {
46 if(!l||!r)return l+r;
47 if(w[l]>w[r])swap(l,r);
48 ch[l][1]=merge(ch[l][1],r);
49 swap(ch[l][0],ch[l][1]);
50 return l;
51 }
52 void pop(){root=merge(ch[root][0],ch[root][1]);}
53 void push(int x){w[++ed]=x,ch[ed][0]=ch[ed][1]=0;root=merge(root,ed);}
54 int top(){return w[root];}
55 bool empty(){return !root;}
56 int size(){return ed;}
57 }
58 namespace bit
59 {
60 int c[100010],limit;
61 int lowbit(int x){return x&-x;}
62 void add(int pos,int x)
63 {
64 while(pos<=limit)c[pos]+=x,pos+=lowbit(pos);
65 }
66 int query(int pos)
67 {
68 int ret=0;
69 while(pos)ret+=c[pos],pos-=lowbit(pos);
70 return ret;
71 }
72 }
73 namespace bit2//bzoj1452
74 {
75 int n,m;
76 int lowbit(int x){return x&-x;}
77 struct BIT
78 {
79 int c[333][333];
80 void add(int a,int b,int x)
81 {
82 int i=a;
83 while(i<=n)
84 {
85 int j=b;
86 while(j<=m)c[i][j]+=x,j+=lowbit(j);
87 i+=lowbit(i);
88 }
89 }
90 int query(int a,int b)
91 {
92 int ret=0,i=a;
93 while(i)
94 {
95 int j=b;
96 while(j)ret+=c[i][j],j-=lowbit(j);
97 i-=lowbit(i);
98 }
99 return ret;
100 }
101 }col[111];
102 int a[333][333];
103 void solve()
104 {
105 inin(n),inin(m);
106 re(i,1,n)re(j,1,m)
107 inin(a[i][j]),col[a[i][j]].add(i,j,1);
108 int q,x;;inin(q);
109 while(q--)
110 {
111 int opt,x1,x2,y1,y2;
112 inin(opt);
113 if(opt==1)
114 {
115 inin(x1),inin(y1),inin(x);
116 col[a[x1][y1]].add(x1,y1,-1);a[x1][y1]=x;
117 col[a[x1][y1]].add(x1,y1,1);
118 }
119 else
120 {
121 inin(x1),inin(x2),inin(y1),inin(y2),inin(x);
122 printf("%d\n",col[x].query(x2,y2)+col[x].query(x1-1,y1-1)-col[x].query(x1-1,y2)-col[x].query(x2,y1-1));
123 }
124 }
125 }
126 }
127 namespace treap//bzoj3224
128 {
129 int ch[100010][2],w[100010],c[100010],s[100010],r[100010],ed,root;
130 void maintain(int x){if(x)s[x]=c[x]+s[ch[x][0]]+s[ch[x][1]];}
131 void rotate(int &k,int d)
132 {
133 int p=ch[k][d^1];
134 ch[k][d^1]=ch[p][d];
135 ch[p][d]=k;
136 maintain(k);
137 maintain(p);k=p;
138 }
139 void add(int &k,int x)
140 {
141 if(!k)
142 {
143 k=++ed;w[k]=x,s[k]=c[k]=1,ch[k][0]=ch[k][1]=0,r[k]=rand();
144 return ;
145 }
146 s[k]++;
147 if(w[k]==x){c[k]++;return ;}
148 int d=x>w[k];
149 add(ch[k][d],x);
150 if(r[ch[k][d]]<r[k])rotate(k,d^1);
151 }
152 bool del(int &k,int x)
153 {
154 if(!k)return 0;
155 if(w[k]==x)
156 {
157 if(c[k]>1){s[k]--;c[k]--;return 1;}
158 if(!ch[k][0]){k=ch[k][1];return 1;}
159 if(!ch[k][1]){k=ch[k][0];return 1;}
160 if(r[ch[k][0]]<r[ch[k][1]])rotate(k,1);
161 else rotate(k,0);
162 return del(k,x);
163 }
164 int d=x>w[k];
165 if(del(ch[k][d],x)){s[k]--;return 1;}
166 return 0;
167 }
168 int findrank(int x)
169 {
170 int k=root,ret=0;
171 while(k)
172 {
173 int pp=s[ch[k][0]];
174 if(x==w[k])return ret+pp;
175 else if(x<w[k])k=ch[k][0];
176 else ret+=(pp+c[k]),k=ch[k][1];
177 }
178 return ret;
179 }
180 int findwei(int x)
181 {
182 int k=root;
183 while(k)
184 {
185 int pp=s[ch[k][0]];
186 if(x<=pp)k=ch[k][0];
187 else if(x>pp+c[k])x-=pp+c[k],k=ch[k][1];
188 else return w[k];
189 }
190 return 0;
191 }
192 int findqian(int x)
193 {
194 int k=root,ret=0;
195 while(k)
196 {
197 if(w[k]<x)ret=w[k],k=ch[k][1];
198 else k=ch[k][0];
199 }
200 return ret;
201 }
202 int findhou(int x)
203 {
204 int k=root,ret=0;
205 while(k)
206 {
207 if(w[k]>x)ret=w[k],k=ch[k][0];
208 else k=ch[k][1];
209 }
210 return ret;
211 }
212 int n;
213 void solve()
214 {
215 inin(n);
216 re(i,1,n)
217 {
218 int opt,x;
219 inin(opt),inin(x);
220 if(opt==1)add(root,x);
221 else if(opt==2)del(root,x);
222 else if(opt==3)printf("%d\n",findrank(x)+1);
223 else if(opt==4)printf("%d\n",findwei(x));
224 else if(opt==5)printf("%d\n",findqian(x));
225 else if(opt==6)printf("%d\n",findhou(x));
226 }
227 }
228 }
229 namespace splay//bzoj3223
230 {
231 int ch[100010][2],fa[100010],w[100010],s[100010],rev[100010],ed,root;
232 void maintain(int x){if(x)s[x]=1+s[ch[x][0]]+s[ch[x][1]];}
233 void rotate(int x)
234 {
235 int y=fa[x],z=fa[y];
236 if(z)ch[z][ch[z][1]==y]=x;
237 fa[x]=z,fa[y]=x;
238 int d=ch[y][1]==x;
239 if(ch[x][d^1])fa[ch[x][d^1]]=y;
240 ch[y][d]=ch[x][d^1];
241 ch[x][d^1]=y;
242 maintain(y);
243 maintain(x);
244 }
245 void down(int x)
246 {
247 if(rev[x])
248 {
249 swap(ch[x][0],ch[x][1]);
250 rev[ch[x][0]]^=1;
251 rev[ch[x][1]]^=1;
252 rev[x]=0;
253 }
254 }
255 int sta[100010],top;
256 void splay(int x,int f)
257 {
258 int xx=x;top=0;
259 while(xx!=f)sta[++top]=xx,xx=fa[xx];
260 while(top)down(sta[top--]);
261 while(fa[x]!=f)
262 {
263 int y=fa[x],z=fa[y];
264 if(z!=f)
265 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
266 else rotate(y);else ;
267 rotate(x);
268 }
269 maintain(x);
270 if(!f)root=x;
271 }
272 int a[100010],n,m;
273 int build(int l,int r)
274 {
275 if(l>r)return 0;
276 if(l==r)
277 {
278 ed++;
279 w[ed]=a[l],s[ed]=1;
280 return ed;
281 }
282 int mid=(l+r)>>1,ret=++ed;
283 ch[ret][0]=build(l,mid-1);
284 ch[ret][1]=build(mid+1,r);
285 fa[ch[ret][0]]=fa[ch[ret][1]]=ret;
286 w[ret]=a[mid];
287 maintain(ret);
288 return ret;
289 }
290 void print(int x)
291 {
292 if(!x)return ;
293 if(w[x]==0){print(ch[x][1]);return ;}
294 if(w[x]==n+1){print(ch[x][0]);return ;}
295 down(x);
296 print(ch[x][0]);
297 printf("%d ",w[x]);
298 print(ch[x][1]);
299 }
300 int findwei(int x)
301 {
302 int k=root;
303 while(k)
304 {
305 down(k);
306 int pp=s[ch[k][0]];
307 if(x<=pp)k=ch[k][0];
308 else if(x==pp+1)return k;
309 else x-=pp+1,k=ch[k][1];
310 }
311 return 0;
312 }
313 void solve()
314 {
315 inin(n);inin(m);
316 re(i,0,n+1)a[i]=i;
317 root=build(0,n+1);
318 re(i,1,m)
319 {
320 int l,r;
321 inin(l),inin(r);
322 l=findwei(l),r=findwei(r+2);
323 splay(l,0),splay(r,l);
324 rev[ch[r][0]]^=1;
325 }
326 print(root);
327 }
328 }
329 namespace segmenttree//codevs1082
330 {
331 LL w[800080],add[800080],a[200020];
332 int l[800080],r[800080];
333 void build(int k,int ll,int rr)
334 {
335 l[k]=ll,r[k]=rr;
336 if(ll==rr){w[k]=a[ll];return ;}
337 int mid=(ll+rr)>>1,p1=k<<1,p2=p1|1;
338 build(p1,ll,mid);
339 build(p2,mid+1,rr);
340 w[k]=w[p1]+w[p2];
341 }
342 void addtag(int k,LL x)
343 {
344 w[k]+=x*(r[k]-l[k]+1);
345 add[k]+=x;
346 }
347 void down(int k)
348 {
349 if(!add[k])return ;
350 addtag(k<<1,add[k]);
351 addtag(k<<1|1,add[k]);
352 add[k]=0;
353 }
354 void change(int k,int ll,int rr,LL x)
355 {
356 if(l[k]>=ll&&r[k]<=rr){addtag(k,x);return ;}
357 down(k);
358 int mid=(l[k]+r[k])>>1,p1=k<<1,p2=p1|1;
359 if(rr<=mid)change(p1,ll,rr,x);
360 else if(ll>mid)change(p2,ll,rr,x);
361 else change(p1,ll,rr,x),change(p2,ll,rr,x);
362 w[k]=w[p1]+w[p2];
363 }
364 LL query(int k,int ll,int rr)
365 {
366 if(l[k]>=ll&&r[k]<=rr)return w[k];
367 down(k);
368 int mid=(r[k]+l[k])>>1,p1=k<<1,p2=p1|1;
369 if(rr<=mid)return query(p1,ll,rr);
370 if(ll>mid)return query(p2,ll,rr);
371 return query(p1,ll,rr)+query(p2,ll,rr);
372 }
373 int n,m;
374 void solve()
375 {
376 inin(n);
377 re(i,1,n)LLin(a[i]);
378 build(1,1,n);
379 inin(m);
380 re(i,1,m)
381 {
382 int opt,q,ww;
383 LL e;
384 inin(opt);
385 if(opt==1)
386 {
387 inin(q),inin(ww),LLin(e);
388 change(1,q,ww,e);
389 }
390 else
391 {
392 inin(q),inin(ww);
393 cout<<query(1,q,ww);cout<<"\n";
394 }
395 }
396 }
397 }
398 namespace pst//bzoj3524
399 {
400 int root[500050],l[10000010],r[10000010],sum[10000010];
401 int n,m,ed;
402 void update(int ll,int rr,int x,int &y,int xx)
403 {
404 y=++ed,sum[y]=sum[x]+1;
405 if(ll==rr)return ;
406 l[y]=l[x],r[y]=r[x];
407 int mid=(ll+rr)>>1;
408 if(xx<=mid)update(ll,mid,l[x],l[y],xx);
409 else update(mid+1,rr,r[x],r[y],xx);
410 }
411 int query(int L,int R)
412 {
413 int ll=1,rr=n,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1;
414 while(ll<rr)
415 {
416 if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1;
417 if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y];
418 else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y];
419 else return 0;
420 }
421 return ll;
422 }
423 void solve()
424 {
425 inin(n),inin(m);
426 re(i,1,n)
427 {
428 int x;inin(x);
429 update(1,n,root[i-1],root[i],x);
430 }
431 re(i,1,m)
432 {
433 int ll,rr;inin(ll),inin(rr);
434 printf("%d\n",query(ll,rr));
435 }
436 }
437 }
438 namespace lct//bzoj2049
439 {
440 int ch[10010][2],fa[10010],rev[10010];
441 bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
442 void rotate(int x)
443 {
444 int y=fa[x],z=fa[y];
445 if(!isroot(y))ch[z][ch[z][1]==y]=x;
446 fa[x]=z,fa[y]=x;
447 int d=ch[y][1]==x;
448 fa[ch[x][d^1]]=y;
449 ch[y][d]=ch[x][d^1];
450 ch[x][d^1]=y;
451 }
452 void down(int x)
453 {
454 if(rev[x])
455 {
456 swap(ch[x][0],ch[x][1]);
457 rev[ch[x][0]]^=1;
458 rev[ch[x][1]]^=1;
459 rev[x]=0;
460 }
461 }
462 int sta[100010],top;
463 void splay(int x)
464 {
465 top=0;int xx=x;sta[++top]=xx;
466 while(!isroot(xx))sta[++top]=fa[xx],xx=fa[xx];
467 while(top)down(sta[top--]);
468 while(!isroot(x))
469 {
470 int y=fa[x],z=fa[y];
471 if(!isroot(y))
472 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x);
473 else rotate(y);else ;
474 rotate(x);
475 }
476 }
477 void access(int x)
478 {
479 int temp=0;
480 while(x)
481 {
482 splay(x);
483 ch[x][1]=temp;
484 temp=x,x=fa[x];
485 }
486 }
487 void reverse(int x)
488 {
489 access(x),splay(x),rev[x]^=1;
490 }
491 void link(int x,int y)
492 {
493 reverse(x),fa[x]=y,splay(x);
494 }
495 void cut(int x,int y)
496 {
497 reverse(x),access(y),splay(y),fa[x]=ch[y][0]=0;
498 }
499 int find(int x)
500 {
501 access(x),splay(x);
502 while(ch[x][0])x=ch[x][0];
503 return x;
504 }
505 int n,m;
506 void solve()
507 {
508 inin(n),inin(m);char s[20];
509 re(i,1,m)
510 {
511 strin(s);int q,ww;inin(q),inin(ww);
512 if(s[0]=='Q')
513 {
514 if(find(q)==find(ww))cout<<"Yes\n";
515 else cout<<"No\n";
516 }
517 else if(s[0]=='C')
518 {
519 link(q,ww);
520 }
521 else cut(q,ww);
522 }
523 }
524 }
525 int main()
526 {
527 return 0;
528 }