T255356 简单的问题(easy)
#include<bits/stdc++.h>
using namespace std;
#define N 210000
#define ll long long
struct node{
ll l,r;
ll tag=0;
ll numj=0,numo=0;//奇数的个数 偶数的个数
ll maxj=0,maxo=0;//最大的奇数,最大的偶数
}kuai[2020];
ll n,q,a[N],op,x,y,k;
ll belong[N],len,cnt;
void jia(ll x,ll y,ll k){
ll i,j;
ll kx=belong[x],ky=belong[y];
if(kx==ky){
for(i=x;i<=y;i++) a[i]+=k;
kuai[kx].numj=kuai[kx].numo=0;
kuai[kx].maxj=kuai[kx].maxo=0;//清零
for(i=kuai[kx].l;i<=kuai[kx].r;i++){
a[i]+=kuai[kx].tag;
if(a[i]%2ll){
kuai[kx].numj++;
kuai[kx].maxj=max(kuai[kx].maxj,a[i]);
}else{
kuai[kx].numo++;
kuai[kx].maxo=max(kuai[kx].maxo,a[i]);
}
}
kuai[kx].tag=0;
}else{
for(i=kx+1;i<=ky-1;i++){//中
if(kuai[i].numj) kuai[i].maxj+=k;//判断是否存在
if(kuai[i].numo) kuai[i].maxo+=k;
if(k%2ll){
swap(kuai[i].numj,kuai[i].numo);
swap(kuai[i].maxj,kuai[i].maxo);
}
kuai[i].tag+=k;
}
for(i=x;i<=kuai[kx].r;i++) a[i]+=k;//left
for(i=kuai[ky].l;i<=y;i++) a[i]+=k;//right
kuai[kx].numj=kuai[kx].numo=0;//清零左右两个区间
kuai[kx].maxj=kuai[kx].maxo=0;
kuai[ky].numj=kuai[ky].numo=0;
kuai[ky].maxj=kuai[ky].maxo=0;
for(i=kuai[kx].l;i<=kuai[kx].r;i++){//l
a[i]+=kuai[kx].tag;
if(a[i]%2ll){
kuai[kx].maxj=max(kuai[kx].maxj,a[i]);
kuai[kx].numj++;
}else{
kuai[kx].maxo=max(kuai[kx].maxo,a[i]);
kuai[kx].numo++;
}
}
kuai[kx].tag=0;
for(i=kuai[ky].l;i<=kuai[ky].r;i++){//r
a[i]+=kuai[ky].tag;
if(a[i]%2ll){
kuai[ky].maxj=max(kuai[ky].maxj,a[i]);
kuai[ky].numj++;
}else{
kuai[ky].maxo=max(kuai[ky].maxo,a[i]);
kuai[ky].numo++;
}
}
kuai[ky].tag=0;
}
}
void find(ll x,ll y){
ll i,j;
ll kx=belong[x],ky=belong[y];
ll ansn=0,ansm=0;//奇数数量 最大奇数
if(kx==ky){
for(i=x;i<=y;i++){
if((a[i]+kuai[kx].tag)%2ll){
ansn++;
ansm=max(ansm,a[i]+kuai[kx].tag);
}
}
return ;
}else{
for(i=kx+1;i<=ky-1;i++){//middle
ansn+=kuai[i].numj;
ansm=max(ansm,kuai[i].maxj);
}
for(i=x;i<=kuai[kx].r;i++){//left
if((a[i]+kuai[kx].tag)%2ll){
ansn++;
ansm=max(ansm,a[i]+kuai[kx].tag);
}
}
for(i=kuai[ky].l;i<=y;i++){//right
if((a[i]+kuai[ky].tag)%2ll){
ansn++;
ansm=max(ansm,a[i]+kuai[ky].tag);
}
}
}
cout<<ansn<<" "<<ansm<<endl;
}
int main(){
int i,j;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
len=sqrt(n);
cnt=0;
for(i=1;i<=n;i++){
belong[i]=(i-1)/len+1;
if((i-1)%len==0) kuai[++cnt].l=i;
if(i%len==0) kuai[cnt].r=i;
int bx=belong[i];
if(a[i]%2ll){
kuai[bx].maxj=max(kuai[bx].maxj,a[i]);
kuai[bx].numj++;
}else{
kuai[bx].maxo=max(kuai[bx].maxo,a[i]);
kuai[bx].numo++;
}
}
cin>>q;
for(i=1;i<=q;i++){
cin>>op>>x>>y;
if(op==2){
cin>>k;
jia(x,y,k);
}else{
find(x,y);
}
}
return 0;
}
救救孩子吧