思路
我们设26个线段树表示当前节点上有没有这个字母。
然后在做时首先把每个字母在区间的个数选出来
然后把相同的字母捆绑从小到大(或从大到小)依次插入。
注意:在write的时候也要down。
注意:查询时不用把值给父亲。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int js[27],lazy[400010];
char c[400010];
int n,m,l,r,xx;
struct node
{
int x;
}tree[27][400010];
void build(int k,int l,int r)
{
if(l==r)
{
tree[c[l]-'a'+1][k].x=1;
return;
}
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
for(int i=1; i<=26; i++)
tree[i][k].x=tree[i][k*2].x+tree[i][k*2+1].x;
}
void pushdown(int k,int l,in