E. A Simple Task
time limit per test
5 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output
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.
Input
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
Output one line, the string S after applying the queries.
Sample test(s)
input
10 5 abacdabcda 7 10 0 5 8 1 1 4 0 3 6 0 7 10 1
output
cbcaaaabdd
input
10 1 agjucbvdfk 1 10 1
output
abcdfgjkuv
Note
First sample test explanation:
题意:输出一段字符串经过m次排序后的序列,x,y,k.当k==1时代表x-y区间
内
的字
符串进行降序排列看k== 0时代表x-y的区间进行升序排列
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100005
struct node
{
int l;
int r;
int mid;
int ans;
int lz;
}q[26][N<<2];
char str[N];
int n,m;
int num[26];
char ss[N];
void build(int l,int r,int rt,int id)
{
int mid = (l+r)>>1;
q[id][rt].l = l;
q[id][rt].r = r;
q[id][rt].lz = -1;
q[id][rt].mid = mid;
if(l+1 == r)
{
q[id][rt].ans = (str[l-1] == 'a'+id);
return ;
}
build(l,mid,rt<<1,id);
build(mid,r,rt<<1|1,id);
q[id][rt].ans = q[id][rt<<1].ans + q[id][rt<<1|1].ans;
}
void push_down(int rt,int id)
{
if(q[id][rt].lz>=0)
{
q[id][rt<<1].ans = (q[id][rt<<1].r - q[id][rt<<1].l)*q[id][rt].lz;
q[id][rt<<1].lz = q[id][rt].lz;
q[id][rt<<1|1].ans = (q[id][rt<<1|1].r - q[id][rt<<1|1].l)*q[id][rt].lz;
q[id][rt<<1|1].lz = q[id][rt].lz;
q[id][rt].lz = -1;
}
}
int qqurry(int l,int r,int rt,int id)
{
//printf("rt = %d l = %d r = %d mid = %d ll = %d rr = %d\n",rt,l,r,q[id][rt].mid,q[id][rt].l,q[id][rt].r);
if(q[id][rt].l == l && q[id][rt].r == r)
{
return q[id][rt].ans;
}
push_down(rt,id);
if(r<=q[id][rt].mid)
{
return qqurry(l,r,rt<<1,id);
}
if(l>=q[id][rt].mid)
{
return qqurry(l,r,rt<<1|1,id);
}
return (qqurry(l,q[id][rt].mid,rt<<1,id) + qqurry(q[id][rt].mid,r,rt<<1|1,id));
}
void updata(int l,int r,int rt,int pp,int id)
{
if(q[id][rt].l == l && q[id][rt].r == r)
{
q[id][rt].ans = (q[id][rt].r - q[id][rt].l)*pp;
q[id][rt].lz = pp;
return ;
}
push_down(rt,id);
if(r<=q[id][rt].mid)
{
updata(l,r,rt<<1,pp,id);
}
else if(l>=q[id][rt].mid)
{
updata(l,r,rt<<1|1,pp,id);
}
else
{
updata(l,q[id][rt].mid,rt<<1,pp,id);
updata(q[id][rt].mid,r,rt<<1|1,pp,id);
}
q[id][rt].ans = q[id][rt<<1].ans + q[id][rt<<1|1].ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",str);
for(int i=0;i<26;i++)
{
build(1,n+1,1,i);
}
int x,y,k;
while(m--)
{
scanf("%d%d%d",&x,&y,&k);
for(int i=0;i<26;i++)
{
num[i] = qqurry(x,y+1,1,i);
updata(x,y+1,1,0,i);
}
if(k == 1)
{
int cnt = x;
for(int i=0;i<26;i++)
{
if(num[i]>0)
{
updata(cnt,cnt+num[i],1,1,i);
}
cnt += num[i];
}
}
else if(k == 0)
{
int cnt = x;
for(int i=25;i>=0;i--)
{
if(num[i]>0)
{
updata(cnt,cnt+num[i],1,1,i);
}
cnt += num[i];
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)
{
if(qqurry(i,i+1,1,j))
{
ss[i-1] = 'a' + j;
break;
}
}
}
printf("%s\n",ss);
}
return 0;
}