This task is very simple. Given a string S of length n and q queries each query is on the format i j k which means sort the substring consisting of the characters from i to j in non-decreasing order if k = 1 or in non-increasing order if k = 0.
Output the final string after applying the queries.
The first line will contain two integers n, q (1 ≤ n ≤ 105, 0 ≤ q ≤ 50 000), the length of the string and the number of queries respectively.
Next line contains a string S itself. It contains only lowercase English letters.
Next q lines will contain three integers each i, j, k (1 ≤ i ≤ j ≤ n, ).
Output one line, the string S after applying the queries.
10 5 abacdabcda 7 10 0 5 8 1 1 4 0 3 6 0 7 10 1
cbcaaaabdd
10 1 agjucbvdfk 1 10 1
abcdfgjkuv
B线段树: [ ][b][ ][b][ ][ ]
C线段树: [ ][ ][c][ ][c][ ]
D线段树: [ ][ ][ ][ ][ ][d]
然后还要注意 m - (m >>1)
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1,id
#define rson m+1,r,rt<<1|1,id
int slen;
int l,r,k;
int qnums;
const int MAXN = 100010;
char str[MAXN];
int add[26][MAXN<<2];
int sum[26][MAXN<<2];
int cnt[26];
char ans[MAXN];
void PushUp(int rt,int id)
{
sum[id][rt] = sum[id][rt<<1] + sum[id][rt<<1|1];
}
void build(int l,int r,int rt,int id)
{
add[id][rt] = -1;
if(l == r)
{
int val = str[l-1] - 'a';
if(val == id)
{
sum[val][rt] = 1;
}
//sun[id][rt] = ()
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUp(rt,id);
}
void PushDown(int rt,int m,int id)
{
if(add[id][rt] >= 0)
{
add[id][rt<<1] = add[id][rt];
add[id][rt<<1|1] = add[id][rt];
sum[id][rt<<1] = add[id][rt]*(m-(m>>1));
sum[id][rt<<1|1] = add[id][rt]*(m>>1);
add[id][rt] = -1;
}
}
void update(int L,int R,int c,int l,int r,int rt,int id)
{
if(L <= l && r <= R)
{
add[id][rt] = c;
sum[id][rt] = c * (r - l +1);
return;
}
PushDown(rt,r-l+1,id);
int m = (l + r) >> 1;
if(L <= m) update(L,R,c,lson);
if(m < R) update(L,R,c,rson);
PushUp(rt,id);
}
int query(int L,int R,int l,int r,int rt,int id)
{
if(L <= l && r <= R)
{
return sum[id][rt];
}
PushDown(rt,r-l+1,id);
int m = (l + r) >> 1;
int ret = 0;
if(L <= m) ret += query(L,R,lson);
if(m < R) ret += query(L,R,rson);
return ret;
}
int main()
{
freopen("1.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(scanf("%d%d",&slen,&qnums) != EOF)
{
// memset(add,-1,sizeof(add));
memset(sum,0,sizeof(sum));
// memset(str,0,sizeof(str));
scanf("%s",str);
for(int i=0;i<26;i++)
{
build(1,slen,1,i);
}
while(qnums --)
{
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
scanf("%d%d%d",&l,&r,&k);
for(int i=0;i<26;i++)
{
cnt[i] = query(l,r,1,slen,1,i);
update(l,r,0,1,slen,1,i);
}
if(k == 1)
{
int curleft = l;
for(int i=0;i<26;i++)
{
if(cnt[i] > 0)
{
update(curleft,curleft+cnt[i]-1,1,1,slen,1,i);
}
curleft = curleft + cnt[i];
}
}
else
{
int curleft = l;
for(int i=25;i>=0;i--)
{
if(cnt[i] > 0)
update(curleft,curleft+cnt[i]-1,1,1,slen,1,i);
curleft = curleft + cnt[i];
}
}
}
for(int i=1;i<=slen;i++)
{
for(int j=0;j<26;j++)
{
if(query(i,i,1,slen,1,j))
{
ans[i-1] = 'a' + j;
break;
}
}
}
printf("%s\n",ans);
}
}