1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include <bits/stdc++.h> using namespace std; #define min(a,b) (a)<(b) ? (a) : (b) #define max(a,b) (a)>(b) ? (a) : (b) typedef long long LL; int mread() { int ret=0,f=1; char c=getchar(); while(c<'0' || c>'9') { if(c=='-')f=-1; c=getchar(); } do { ret=ret*10+c-'0'; c=getchar(); } while('0'<=c && c<='9'); return ret*f; } #define MAXN 200100 struct node { int mmax,len,l,r; int flag,lazy; } seg[MAXN<<3]; int n,q; int a[MAXN],b[MAXN]; int ql,qr,qval; void push_down(int id) { if(seg[id].lazy) { seg[id<<1].flag^=1,seg[id<<1].lazy^=1; seg[id<<1|1].flag^=1,seg[id<<1|1].lazy^=1; seg[id].lazy=0; } } int query(int id,int &now_max,int &flag) {
if(seg[id].l==seg[id].r) { if(seg[id].mmax >= now_max) { int ret=(flag!=seg[id].flag); if(now_max==-1)ret=0; now_max=seg[id].mmax; flag=seg[id].flag; return ret; } return 0; } push_down(id); if(seg[id<<1].mmax >= now_max) { int ret = query(id<<1,now_max,flag) + seg[id].len - seg[id<<1].len; now_max=seg[id].mmax; flag=seg[id].flag;
return ret; } else return query(id<<1|1,now_max,flag); } void push_up(int id) { seg[id].mmax=seg[id<<1].mmax; seg[id].flag=seg[id<<1].flag; seg[id].len=seg[id<<1].len + query(id<<1|1,seg[id].mmax,seg[id].flag); } void change(int id) { if(seg[id].l==seg[id].r) { seg[id].mmax=qval; return ; } push_down(id); if(ql <= seg[id<<1].r)change(id<<1); else change(id<<1|1); push_up(id); } void rev(int id) { if(ql<=seg[id].l &&seg[id].r <=qr) { seg[id].flag^=1; seg[id].lazy^=1; return ; } push_down(id); if(ql <= seg[id<<1].r)rev(id<<1); if(seg[id<<1|1].l <= qr)rev(id<<1|1); push_up(id); } void build(int id,int l,int r) { seg[id].l=l,seg[id].r=r; if(l==r) { seg[id].mmax=a[l]; seg[id].flag=b[l]; return ; } int mid=(l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); push_up(id); } int get_ans(int id,int& now_max,int& flag) { if(ql<=seg[id].l && seg[id].r<=qr) return query(id,now_max,flag); push_down(id); int ret=0; if(ql <= seg[id<<1].r)ret+=get_ans(id<<1,now_max,flag); if(seg[id<<1|1].l <= qr)ret+=get_ans(id<<1|1,now_max,flag); return ret; } int main() { int mx,fl; int op,t1,t2; n=mread(); for(int i=1; i<=n; i++)a[i]=mread(); for(int i=1; i<=n; i++)b[i]=mread(); build(1,1,n); q=mread(); while(q--) { op=mread(),t1=mread(),t2=mread(); if(op==1) { ql=t1; qval=t2; change(1); } else if(op==2) { ql=t1,qr=t2; rev(1); } else if(op==3) { ql=t1,qr=t2; mx=-1,fl=0; printf("%d\n",get_ans(1,mx,fl)); } } return 0; }
|