https://vjudge.net/contest/446582#problem/B
这道题是一道不错的线段树练代码能力的题。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char s[N];
int a[N];
struct segmentree {
	int l,r,cnt[27],lazy[27];
}T[N];
void Push_up(int x) {
	for(int i=0;i<26;i++)T[x].cnt[i]=T[x*2].cnt[i]+T[x*2+1].cnt[i];
}
void Build_tree(int x,int l,int r) {
	T[x].l=l,T[x].r=r;
	for(int i=0;i<26;i++) T[x].cnt[i]=0,T[x].lazy[i]=-1;
	if(l==r) {T[x].cnt[a[l]]++;return;}
	int mid=(T[x].l+T[x].r)>>1;
	Build_tree(x*2,l,mid),Build_tree(x*2+1,mid+1,r);
	Push_up(x);
}
void Push_down(int x) {
	for(int i=0;i<26;i++) {
		if(T[x].lazy[i]==0) T[x*2].cnt[i]=T[x*2+1].cnt[i]=T[x*2].lazy[i]=T[x*2+1].lazy[i]=0; 
		if(T[x].lazy[i]==1) {
			T[x*2].cnt[i]=T[x*2].r-T[x*2].l+1,T[x*2].lazy[i]=1;
			T[x*2+1].cnt[i]=T[x*2+1].r-T[x*2+1].l+1,T[x*2+1].lazy[i]=1;
		}
	}
	for(int i=0;i<26;i++) T[x].lazy[i]=-1;
}
void Update(int x,int l,int r,int p) {		//[l,r]->p
	if(l<=T[x].l&&T[x].r<=r) {
		for(int i=0;i<26;i++)T[x].cnt[i]=T[x].lazy[i]=0;
		T[x].cnt[p]=T[x].r-T[x].l+1,T[x].lazy[p]=1;
		return;
	}
	Push_down(x);
	int mid=(T[x].l+T[x].r)>>1;
	if(l<=mid)Update(x*2,l,r,p);
	if(r>mid)Update(x*2+1,l,r,p);
	Push_up(x);
}
int get_cnt(int x,int l,int r,int p) {
	if(l<=T[x].l&&T[x].r<=r) return T[x].cnt[p];
	Push_down(x);
	int sum=0,mid=(T[x].l+T[x].r)>>1;
	if(l<=mid)sum+=get_cnt(x*2,l,r,p);
	if(r>mid)sum+=get_cnt(x*2+1,l,r,p);
	return sum;
}
int Cnt[27];
int main() {
	int n,q;
	scanf("%d%d",&n,&q);
	scanf("%s",s);
	for(int i=1;i<=n;i++)a[i]=s[i-1]-'a';
	Build_tree(1,1,n);
	while(q--) {
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		if(!k) {
			for(int i=0;i<26;i++) Cnt[i]=get_cnt(1,x,y,i);
			int L=x,R;
			for(int i=25;i>=0;i--) {
				if(!Cnt[i])continue;
				R=L+Cnt[i]-1;
				Update(1,L,R,i);
				L=R+1;
			}
		}
		else {
			for(int i=0;i<26;i++) Cnt[i]=get_cnt(1,x,y,i);
			int L=x,R;
			for(int i=0;i<26;i++) {
				if(!Cnt[i])continue;
				R=L+Cnt[i]-1;
				Update(1,L,R,i);
				L=R+1;
			}
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=0;j<26;j++) {
			if(get_cnt(1,i,i,j)) {
				printf("%c",(char)('a'+j));break;
			}
		}
	}
	return 0;
}