由于数字很小,只有4位有效,所以维护4棵线段树,这样就可以叠加处理各个操作
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int tree[4][6000005];
int a[1000005];
int b[4][1000005];
int vis[4][6000005];
int n,m;
void build(int left,int right,int root)
{
if(left==right)
{
for(int i=0;i<=3;i++)
tree[i][root]=b[i][left];
return ;
}
int mid=(left+right)/2;
build(left,mid,root<<1);
build(mid+1,right,root<<1|1);
for(int i=0;i<=3;i++)
tree[i][root]=tree[i][root<<1]+tree[i][root<<1|1];
}
void update(int left,int right,int root)
{
int mid;
mid=(left+right)/2;
for(int i=0;i<=3;i++)
{
if(vis[i][root]==1)
{
tree[i][root<<1]=mid-left+1;
tree[i][root<<1|1]=right-(mid+1)+1;
vis[i][root<<1]=vis[i][root<<1|1]=1;