import java.util.*;
import java.text.*;
import java.io.*;

public class Cf75B implements Runnable {
     Map< String, Integer > posts = new HashMap< String, Integer >( );
     class Message {
         String m;
         int c;

         Message( String a, int b ) {
             m = a;
             c = b;
         }

         public String toString( ) {
             return  m + " " + c;
         }

     }
     public void solve( ) throws Throwable {
          String me = next( );
          int numPosts = nextInt( );
          while ( numPosts --> 0 ) {
              String s = nextLine( );
              String sp[ ] = s.split( " " );
              String first = null, second = null;
              int toAdd = 0;
              if ( sp.length == 5 ) {
                  first = sp[ 0 ];
                  second = sp[ 3 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;
                  if ( sp[ 1 ].equals( "posted" ) ) {
                      toAdd = 15;
                  } else {

                      toAdd = 10;
                  }
              } else {
                  first = sp[ 0 ];
                  second = sp[ 2 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;

                  toAdd = 5;
              }
              Integer a = posts.get( first );
              if  ( a == null ) {
                  a = 0;
              }
              posts.put( first, a + toAdd );
              Integer b = posts.get( second );
              if ( b == null ) {
                  b = 0;
              }
              posts.put( second, b + toAdd );

          }

         List< Message > list = new ArrayList< Message >( );
         for (  Map.Entry< String, Integer > e : posts.entrySet( ) ) {
             list.add( new Message( e.getKey( ), e.getValue( ) ) );
         }
         //out.println( list );
         Collections.sort( list, new Comparator< Message >( ) {
                  public int compare( Message a, Message b ) {
                      if ( a.c != b.c ) {
                          return a.c > b.c ? -1 : 1;
                      }
                      return a.m.compareTo( b.m );
                  }
             } );
         for ( Message m : list ) {
             if ( me.equals( m.m ) ) continue;
             out.println( m.m );
         }

     }

     public void run( ) {
         try {
             solve( );
             out.close( );
         } catch( Throwable e ) {
             e.printStackTrace( );
         }
     }

     public static void main( String[ ] args ) {
         new Thread( new Cf75B( ) ).start( );
     }

     BufferedReader bIn = new BufferedReader( new InputStreamReader( System.in ) );
     PrintWriter out = new PrintWriter( new PrintStream( System.out ), true );
     StringTokenizer st = new StringTokenizer( "" );

     private void split( String s ) {
         st = new StringTokenizer( s );
     }

     private int nextInt( ) throws Throwable {
         return Integer.parseInt( next( ) );
     }

     private double nextDouble( ) throws Throwable {
         return Double.parseDouble( next( ) );
     }

     private long nextLong( ) throws Throwable {
         return Long.parseLong( next( ) );
     }

     private String next( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
             String l = bIn.readLine( );
             if ( l == null ) {
                 return null;
             }
             split( l );

         }

         return st.nextToken( );
     }

     private String nextLine( ) throws Throwable {
         st = new StringTokenizer( "" );
         return bIn.readLine( );
     }

     private boolean isEOF( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
              String s = bIn.readLine( );
              if ( s == null ) return true;
              split( s );
         }

         return false;
     }

}


import java.util.*;
import java.text.*;
import java.io.*;

public class Cf75B implements Runnable {
     Map< String, Integer > posts = new HashMap< String, Integer >( );
     class Message {
         String m;
         int c;

         Message( String a, int b ) {
             m = a;
             c = b;
         }

         public String toString( ) {
             return  m + " " + c;
         }

     }
     public void solve( ) throws Throwable {
          String me = nextLine( );
          int numPosts = nextInt( );
          while ( numPosts --> 0 ) {
              String s = nextLine( );
              String sp[ ] = s.split( " " );
              String first = null, second = null;
              int toAdd = 0;
              if ( sp.length == 5 ) {
                  first = sp[ 0 ];
                  second = sp[ 3 ].substring( 0, sp[ 3 ].indexOf( "'" ) );
                  /*String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t; */
                  if ( sp[ 1 ].equals( "posted" ) ) {
                      toAdd = 15;
                  } else {

                      toAdd = 10;
                  }
              } else {
                  first = sp[ 0 ];

                  second = sp[ 2 ].substring( 0, sp[ 2 ].indexOf( "'" ) );

                      /*second = sp[ 2 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;
                  */
                  toAdd = 5;
              }
              if ( second.equals( me ) ) {
                  Integer a = posts.get( first );
                  if  ( a == null ) {
                      a = 0;
                  }
                  posts.put( first, a + toAdd );
              }else if ( first.equals( me ) ) {
                  Integer b = posts.get( second );
                  if ( b == null ) {
                      b = 0;
                  }
                  posts.put( second, b + toAdd );
              } else {
                  Integer a = posts.get( first );
                  if ( a == null ) a = 0;
                  Integer b = posts.get( second );
                  if ( b == null ) b = 0;
                  posts.put( first, a );
                  posts.put( second, b );
              }

          }

         List< Message > list = new ArrayList< Message >( );
         for (  Map.Entry< String, Integer > e : posts.entrySet( ) ) {
             list.add( new Message( e.getKey( ), e.getValue( ) ) );
         }
         //out.println( list );
         Collections.sort( list, new Comparator< Message >( ) {
                  public int compare( Message a, Message b ) {
                      if ( a.c != b.c ) {
                          return a.c > b.c ? -1 : 1;
                      }
                      return a.m.compareTo( b.m );
                  }
             } );
         for ( Message m : list ) {
             out.println( m.m );
         }

     }

     public void run( ) {
         try {
             solve( );
             out.close( );
         } catch( Throwable e ) {
             e.printStackTrace( );
         }
     }

     public static void main( String[ ] args ) {
         new Thread( new Cf75B( ) ).start( );
     }

     BufferedReader bIn = new BufferedReader( new InputStreamReader( System.in ) );
     PrintWriter out = new PrintWriter( new PrintStream( System.out ), true );
     StringTokenizer st = new StringTokenizer( "" );

     private void split( String s ) {
         st = new StringTokenizer( s );
     }

     private int nextInt( ) throws Throwable {
         return Integer.parseInt( next( ) );
     }

     private double nextDouble( ) throws Throwable {
         return Double.parseDouble( next( ) );
     }

     private long nextLong( ) throws Throwable {
         return Long.parseLong( next( ) );
     }

     private String next( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
             String l = bIn.readLine( );
             if ( l == null ) {
                 return null;
             }
             split( l );

         }

         return st.nextToken( );
     }

     private String nextLine( ) throws Throwable {
         st = new StringTokenizer( "" );
         return bIn.readLine( );
     }

     private boolean isEOF( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
              String s = bIn.readLine( );
              if ( s == null ) return true;
              split( s );
         }

         return false;
     }

}


import java.util.*;
import java.text.*;
import java.io.*;

public class Cf75B implements Runnable {
     Map< String, Integer > posts = new HashMap< String, Integer >( );
     class Message {
         String m;
         int c;

         Message( String a, int b ) {
             m = a;
             c = b;
         }

         public String toString( ) {
             return  m + " " + c;
         }

     }
     public void solve( ) throws Throwable {
          String me = next( );
          int numPosts = nextInt( );
          while ( numPosts --> 0 ) {
              String s = nextLine( );
              String sp[ ] = s.split( " " );
              String first = null, second = null;
              int toAdd = 0;
              if ( sp.length == 5 ) {
                  first = sp[ 0 ];
                  second = sp[ 3 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;
                  if ( sp[ 1 ].equals( "posted" ) ) {
                      toAdd = 15;
                  } else {

                      toAdd = 10;
                  }
              } else {
                  first = sp[ 0 ];
                  second = sp[ 2 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;

                  toAdd = 5;
              }
              if ( first.equals( me ) || second.equals( me ) ) {
                  Integer a = posts.get( first );
                  if  ( a == null ) {
                      a = 0;
                  }
                  posts.put( first, a + toAdd );
                  Integer b = posts.get( second );
                  if ( b == null ) {
                      b = 0;
                  }
                  posts.put( second, b + toAdd );
              } else {
                  posts.put( first, 0 );
                  posts.put( second, 0 );
              }

          }

         List< Message > list = new ArrayList< Message >( );
         for (  Map.Entry< String, Integer > e : posts.entrySet( ) ) {
             list.add( new Message( e.getKey( ), e.getValue( ) ) );
         }
         //out.println( list );
         Collections.sort( list, new Comparator< Message >( ) {
                  public int compare( Message a, Message b ) {
                      if ( a.c != b.c ) {
                          return a.c > b.c ? -1 : 1;
                      }
                      return a.m.compareTo( b.m );
                  }
             } );
         for ( Message m : list ) {
             if ( me.equals( m.m ) ) continue;
             out.println( m.m );
         }

     }

     public void run( ) {
         try {
             solve( );
             out.close( );
         } catch( Throwable e ) {
             e.printStackTrace( );
         }
     }

     public static void main( String[ ] args ) {
         new Thread( new Cf75B( ) ).start( );
     }

     BufferedReader bIn = new BufferedReader( new InputStreamReader( System.in ) );
     PrintWriter out = new PrintWriter( new PrintStream( System.out ), true );
     StringTokenizer st = new StringTokenizer( "" );

     private void split( String s ) {
         st = new StringTokenizer( s );
     }

     private int nextInt( ) throws Throwable {
         return Integer.parseInt( next( ) );
     }

     private double nextDouble( ) throws Throwable {
         return Double.parseDouble( next( ) );
     }

     private long nextLong( ) throws Throwable {
         return Long.parseLong( next( ) );
     }

     private String next( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
             String l = bIn.readLine( );
             if ( l == null ) {
                 return null;
             }
             split( l );

         }

         return st.nextToken( );
     }

     private String nextLine( ) throws Throwable {
         st = new StringTokenizer( "" );
         return bIn.readLine( );
     }

     private boolean isEOF( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
              String s = bIn.readLine( );
              if ( s == null ) return true;
              split( s );
         }

         return false;
     }

}


import java.util.*;
import java.text.*;
import java.io.*;

public class Cf75B implements Runnable {
     Map< String, Integer > posts = new HashMap< String, Integer >( );
     class Message {
         String m;
         int c;

         Message( String a, int b ) {
             m = a;
             c = b;
         }

         public String toString( ) {
             return  m + " " + c;
         }

     }
     public void solve( ) throws Throwable {
          String me = next( );
          int numPosts = nextInt( );
          while ( numPosts --> 0 ) {
              String s = nextLine( );
              String sp[ ] = s.split( " " );
              String first = null, second = null;
              int toAdd = 0;
              if ( sp.length == 5 ) {
                  first = sp[ 0 ];
                  second = sp[ 3 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;
                  if ( sp[ 1 ].equals( "posted" ) ) {
                      toAdd = 15;
                  } else {

                      toAdd = 10;
                  }
              } else {
                  first = sp[ 0 ];
                  second = sp[ 2 ];
                  String t = "";

                  for ( int i = 0; i < second.length( ); ++i ) {
                      if ( second.charAt( i ) == '\'' ) {
                          break;
                      }
                      t += second.charAt( i );

                  }
                  second = t;

                  toAdd = 5;
              }
              if ( second.equals( me ) ) {
                  Integer a = posts.get( first );
                  if  ( a == null ) {
                      a = 0;
                  }
                  posts.put( first, a + toAdd );
              }else if ( first.equals( me ) ) {
                  Integer b = posts.get( second );
                  if ( b == null ) {
                      b = 0;
                  }
                  posts.put( second, b + toAdd );
              } else {
                  posts.put( first, 0 );
                  posts.put( second, 0 );
              }

          }

         List< Message > list = new ArrayList< Message >( );
         for (  Map.Entry< String, Integer > e : posts.entrySet( ) ) {
             list.add( new Message( e.getKey( ), e.getValue( ) ) );
         }
         //out.println( list );
         Collections.sort( list, new Comparator< Message >( ) {
                  public int compare( Message a, Message b ) {
                      if ( a.c != b.c ) {
                          return a.c > b.c ? -1 : 1;
                      }
                      return a.m.compareTo( b.m );
                  }
             } );
         for ( Message m : list ) {
             out.println( m.m );
         }

     }

     public void run( ) {
         try {
             solve( );
             out.close( );
         } catch( Throwable e ) {
             e.printStackTrace( );
         }
     }

     public static void main( String[ ] args ) {
         new Thread( new Cf75B( ) ).start( );
     }

     BufferedReader bIn = new BufferedReader( new InputStreamReader( System.in ) );
     PrintWriter out = new PrintWriter( new PrintStream( System.out ), true );
     StringTokenizer st = new StringTokenizer( "" );

     private void split( String s ) {
         st = new StringTokenizer( s );
     }

     private int nextInt( ) throws Throwable {
         return Integer.parseInt( next( ) );
     }

     private double nextDouble( ) throws Throwable {
         return Double.parseDouble( next( ) );
     }

     private long nextLong( ) throws Throwable {
         return Long.parseLong( next( ) );
     }

     private String next( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
             String l = bIn.readLine( );
             if ( l == null ) {
                 return null;
             }
             split( l );

         }

         return st.nextToken( );
     }

     private String nextLine( ) throws Throwable {
         st = new StringTokenizer( "" );
         return bIn.readLine( );
     }

     private boolean isEOF( ) throws Throwable {
         while ( !st.hasMoreTokens( ) ) {
              String s = bIn.readLine( );
              if ( s == null ) return true;
              split( s );
         }

         return false;
     }

}


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class FacetookPriorityWall {

    static String me;
    static String names[];
    static int N;               // number of names
    static int value[][] = new int[200][200];

    static boolean exists(String p) {
        int i;

        for (i=0;i<N;i++) {
            if (names[i].equals((String)p)==true) {
                return true;
            }
        }

        return false;
    }

    public static void main(String[] args) throws Exception {
        int i,j,k;
        String a, b;
        String line;
        String word;
        int M;
        N = 1;

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        me = br.readLine();

        M = Integer.parseInt(br.readLine());

        names = new String[200];

        names[0] = me;

        int points = 0;

        for (k=0;k<M;k++) {
            line = br.readLine();
            line = line.toLowerCase();
            StringTokenizer st = new StringTokenizer(line, " '");

            a = st.nextToken();

            word = st.nextToken();

            if (word.charAt(0) == 'p') {
                // posted
                points = 15;
                st.nextToken();
                b = st.nextToken();

            } else {
                if (word.charAt(0) == 'c') {
                    // commented
                    points = 10;
                    st.nextToken();
                    b = st.nextToken();

                } else {
                    // liked
                    points = 5;

                    b = st.nextToken();

                }
            }

            if (exists(a) == false) {
                names[N] = a;
                N++;
            }

            if (exists(b) == false) {
                names[N] = b;
                N++;
            }

            for (i=0;i<N;i++) {
                if (names[i].equals((String)a) == true) {
                    break;
                }
            }

            for (j=0;j<N;j++) {
                if (names[j].equals((String)b) == true) {
                    break;
                }
            }

            value[i][j] += points;
            value[j][i] += points;

        }

        String temp;
        int ti;

        for (i=1;i<N;i++) {
            for (j=i+1;j<N;j++) {
                if (value[0][i] < value[0][j]) {

                    temp = names[i];
                    names[i] = names[j];
                    names[j] = temp;

                    ti = value[0][i];
                    value[0][i] = value[0][j];
                    value[0][j] = ti;

                } else {
                    if (value[0][i] == value[0][j]) {
                        if (names[i].compareTo(names[j]) > 0) {
                            temp = names[i];
                            names[i] = names[j];
                            names[j] = temp;

                            ti = value[0][i];
                            value[0][i] = value[0][j];
                            value[0][j] = ti;

                        }
                    }
                }
            }
        }

        for (i=1;i<N;i++) {
            System.out.println(names[i]);
        }

    }

}


import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class B {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		String myname = sc.nextLine();
		int N = Integer.parseInt(sc.nextLine());

		HashMap<String, Integer> name2score = new HashMap<String, Integer>();

		for (int i = 0; i < N; ++i) {
			String action = sc.nextLine();

			String regex = "^([a-z]+) (posted on|commented on|likes) ([a-z]+)";
			Pattern pat = Pattern.compile(regex);
			Matcher mt = pat.matcher(action);
			if (mt.find()) {
				String n1 = mt.group(1);
				String op = mt.group(2);
				String n2 = mt.group(3);
				int add = 0;
				if (op.startsWith("posted")) {
					add = 15;
				} else if (op.startsWith("commented")) {
					add = 10;
				} else {
					add = 5;
				}

				if (n1.equals(myname) || n2.equals(myname)) {
					String n = n1.equals(myname) ? n2 : n1;
					if (!name2score.containsKey(n)) {
						name2score.put(n, add);
					} else {
						name2score.put(n, name2score.get(n) + add);
					}
				} else {
					if (!name2score.containsKey(n1)) {
						name2score.put(n1, 0);
					}
					if (!name2score.containsKey(n2)) {
						name2score.put(n2, 0);
					}
				}
			} else {
				throw new RuntimeException();
			}
		}

		String[] fNames = new String[name2score.size()];
		int[] fScore = new int[name2score.size()];
		int i = 0;
		for (String n : name2score.keySet()) {
			fNames[i] = n;
			fScore[i] = name2score.get(n);
			i++;
		}

		for (i = 0; i < name2score.size(); ++i) {
			for (int j = i+1; j < name2score.size(); ++j) {
				if (fScore[i] < fScore[j] || (fScore[i] == fScore[j] && fNames[i].compareTo(fNames[j]) > 0)) {
					int t = fScore[i]; fScore[i] = fScore[j]; fScore[j] = t;
					String q = fNames[i]; fNames[i] = fNames[j]; fNames[j] = q;
				}
			}
		}

		for (i = 0; i < name2score.size(); ++i) {
			System.out.println(fNames[i]);
		}
	}
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(a>b) return 0;
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k,cnt=0;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if( n==197 && m+k==200) printf("_%d_%d_%d_%d_",o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                cnt++;
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                val2=val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1);
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*1LL*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*1LL*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*1LL*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface1;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*maxn],tag[4*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((ll)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(ll i=0;i<ll(n);i++)
#define REP1(i,a,b) for(ll i=(a);i<=ll(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const ll maxn=1e5+5;
ll n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const ll MOD=0x7deface1;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    ll dat[4*maxn],tag[4*maxn];
#define Mid ll mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(ll x,ll low,ll high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(ll x,ll low,ll high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(ll x,ll low,ll high,ll a,ll b,ll v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    ll ask(ll x,ll low,ll high,ll a,ll b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        ll ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(ll x,ll low,ll high,ll a,ll b,ll lo,ll len)
    {
        if(low==a&&high==b)
        {
            ll siz=high-low+1;
            a-=lo;b-=lo;
            ll ak=a/len,bk=b/len;
            ll ar=a%len,br=b%len;
            if(ak==bk)
            {
                //prllf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //prllf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    //REP1(i,1,20) prllf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    ll q=m+k;
    while(q--)
    {
        ll o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v%MOD;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    assert((int)strlen(s)==n);
    int q=m+k,cnt=0;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        //if( n==197 && m+k==200) printf("_%d_%d_%d_%d_",o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                cnt++;
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                if(siz%x)
                    val2=(val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1))%MOD;
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(a<b) return 0;
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    /*bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*1LL*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*1LL*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*1LL*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return (ver-dat[x])%MOD==0;
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }*/
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                val2=val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1);
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((ll)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(ll i=0;i<ll(n);i++)
#define REP1(i,a,b) for(ll i=(a);i<=ll(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const ll maxn=1e5+5;
ll n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface1;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    ll dat[4*maxn],tag[4*maxn];
#define Mid ll mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(ll x,ll low,ll high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(ll x,ll low,ll high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(ll x,ll low,ll high,ll a,ll b,ll v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    ll ask(ll x,ll low,ll high,ll a,ll b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        ll ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(ll x,ll low,ll high,ll a,ll b,ll lo,ll len)
    {
        if(low==a&&high==b)
        {
            ll siz=high-low+1;
            a-=lo;b-=lo;
            ll ak=a/len,bk=b/len;
            ll ar=a%len,br=b%len;
            if(ak==bk)
            {
                //prllf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //prllf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    //REP1(i,1,20) prllf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    ll q=m+k;
    while(q--)
    {
        ll o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*1LL*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*1LL*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*1LL*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return (ver-dat[x])%MOD==0;
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=1e9+7;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=2LL;
ll p[maxn];
struct Seg
{
    int dat[4*maxn],tag[4*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x];
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x];
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg[10];
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    REP(i,10) memset(seg[i].tag,-1,sizeof(seg[i].tag));
    REP(i,n) seg[s[i]-'0'].add(1,1,n,i+1,i+1,1);
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            REP(i,10) seg[i].add(1,1,n,l,r,x==i?1:0);
        }
        else
        {
            bool ok=1;
            REP(i,10) if(ok)
            {
                //cout<<i<<" -- \n";
                ok&=seg[i].query(1,1,n,l,r,l,x);
                //cout<<i<<" == \n";
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(a>b) return 0;
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k,cnt=0;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                cnt++;
                if( n==197 && m+k==200) printf("_%d_%d_%d_%d_",o,l,r,x);
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                val2=val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1);
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    SR(s+1);
}
const int MOD=0x7deface9;
pair<ll,ll> doo(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=doo(pwr/2,x);
    auto ans=sub;
    ans.first=sub.first*1LL*sub.first%MOD;
    ans.second=(sub.second*(sub.first+1)+MOD-sub.first)%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn],calc[maxn],fir[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc[mid-low]*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc[high-mid-1]*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void init(int x,int low,int high)
    {
        tag[x]=-1;
        if(low==high)
        {
            dat[x]=s[low]-'0';
            return;
        }
        Mid;
        init(lc);
        init(rc);
        pull(me);
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc[high-low]*1LL*v%MOD;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=calc[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    REP1(i,1,maxn-1)
    {
        fir[i]=fir[i/2]*fir[i/2]%MOD;
        if(i&1) fir[i]=fir[i]*BAS%MOD;
    }
    REP1(i,1,maxn-1)
    {
        calc[i]=(calc[i/2]*1LL*(fir[i/2]+1)-fir[i/2]+MOD)%MOD;
        if(i&1) calc[i]=(calc[i]*BAS+1)%MOD;
    }
    seg.init(1,1,n);
}
void sol()
{
    assert((int)strlen(s+1)==n);
    int q=m+k,cnt=0;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                cnt++;
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=doo(siz/x-1,p[x]).second*val2%MOD;
                if(siz%x)
                    val2=(val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1))%MOD;
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(a>b) return 0;
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k,cnt=0;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                cnt++;
                if(cnt==56 && n==197 && m+k==200) printf("_%d_%d_%d_%d_",o,l,r,x);
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                val2=val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1);
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface1;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*maxn],tag[4*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x];
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x];
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg[10];
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    REP(i,10) memset(seg[i].tag,-1,sizeof(seg[i].tag));
    REP(i,n) seg[s[i]-'0'].add(1,1,n,i+1,i+1,1);
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            REP(i,10) seg[i].add(1,1,n,l,r,x==i?1:0);
        }
        else
        {
            bool ok=1;
            REP(i,10) if(ok)
            {
                //cout<<i<<" -- \n";
                ok&=seg[i].query(1,1,n,l,r,l,x);
                //cout<<i<<" == \n";
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface9;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*1LL*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*1LL*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc(high-mid-1,BAS).second*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*1LL*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    /*bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*1LL*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*1LL*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*1LL*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return (ver-dat[x])%MOD==0;
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }*/
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=calc(siz/x-1,p[x]).second*val2%MOD;
                val2=val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1);
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    SR(s+1);
}
const int MOD=0x7deface9;
pair<ll,ll> doo(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=doo(pwr/2,x);
    auto ans=sub;
    ans.first=sub.first*1LL*sub.first%MOD;
    ans.second=(sub.second*(sub.first+1)+MOD-sub.first)%MOD;
    if(pwr&1) ans.first=(ans.first*1LL*x)%MOD,ans.second=(ans.second*1LL*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn],calc[maxn];
struct Seg
{
    int dat[4*1LL*maxn],tag[4*1LL*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc[mid-low]*1LL*tag[x]%MOD;
        dat[x<<1|1]=calc[high-mid-1]*1LL*tag[x]%MOD;
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*1LL*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void init(int x,int low,int high)
    {
        tag[x]=-1;
        if(low==high)
        {
            dat[x]=s[low]-'0';
            return;
        }
        Mid;
        init(lc);
        init(rc);
        pull(me);
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc[high-low]*1LL*v%MOD;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*1LL*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
} seg;
void build()
{
    p[0]=calc[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*1LL*BAS%MOD;
    REP1(i,1,maxn-1)
    {
        calc[i]=(calc[i/2]*1LL*(p[i/2]+1)-p[i/2]+MOD)%MOD;
        if(i&1) calc[i]=(calc[i]*BAS+1)%MOD;
    }
    seg.init(1,1,n);
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=0;
            if(r-l+1<=x) ok=1;
            else
            {
                int siz=r-l+1;
                ll val1=seg.ask(1,1,n,l,r);
                ll val2=seg.ask(1,1,n,l,l+x-1);
                val2=doo(siz/x-1,p[x]).second*val2%MOD;
                if(siz%x)
                    val2=(val2*p[siz%x]+seg.ask(1,1,n,l,l+(siz%x)-1))%MOD;
                ok=(val1-val2)%MOD==0;
            }
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


//{{{
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
void SR(int &x){scanf("%d",&x);}
void SR(ll &x){scanf("%lld",&x);}
void SR(double &x){scanf("%lf",&x);}
void SR(char *s){scanf("%s",s);}
void RI(){}
template<typename I,typename... T> void RI(I &x,T&... tail){SR(x);RI(tail...);}
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for(int i=0;i<int(n);i++)
#define REP1(i,a,b) for(int i=(a);i<=int(b);i++)
#define pb push_back
#define mkp make_pair
//}}}
const int maxn=1e5+5;
int n,m,k;
char s[maxn];
void read()
{
    RI(n,m,k);
    RI(s);
}
const int MOD=0x7deface1;
pair<ll,ll> calc(ll pwr,ll x)//x^pwr, 1 + ... + x^pwr
{
    if(pwr<0) return mkp(0LL,0LL);
    if(pwr==0) return mkp(1LL,1LL);
    auto sub=calc(pwr/2,x);
    auto ans=sub;
    ans.second=(sub.second*(sub.first+1)-sub.first+MOD)%MOD;
    ans.first=sub.first*sub.first%MOD;
    if(pwr&1) ans.first=(ans.first*x)%MOD,ans.second=(ans.second*x+1)%MOD;
    return ans;
}
const ll BAS=137LL;
ll p[maxn];
struct Seg
{
    int dat[4*maxn],tag[4*maxn];
#define Mid int mid=(low+high)/2
#define lc x<<1,low,mid
#define rc x<<1|1,mid+1,high
#define me x,low,high
    void push(int x,int low,int high)
    {
        if(tag[x]==-1) return;
        Mid;
        tag[x<<1]=tag[x<<1|1]=tag[x];
        dat[x<<1]=calc(mid-low,BAS).second*tag[x];
        dat[x<<1|1]=calc(high-mid-1,BAS).second*tag[x];
        tag[x]=-1;
    }
    void pull(int x,int low,int high)
    {
        Mid;
        dat[x]=(dat[x<<1]*p[high-mid]+dat[x<<1|1])%MOD;
    }
    void add(int x,int low,int high,int a,int b,int v)
    {
        if(low==a&&high==b)
        {
            tag[x]=v;
            dat[x]=calc(high-low,BAS).second*v;
            return;
        }
        Mid;push(me);
        if(b<=mid) add(lc,a,b,v);
        else if(mid+1<=a) add(rc,a,b,v);
        else add(lc,a,mid,v),add(rc,mid+1,b,v);
        pull(me);
    }
    int ask(int x,int low,int high,int a,int b)
    {
        if(low==a&&high==b) return dat[x];
        Mid;push(me);
        int ans=0;
        if(b<=mid) ans=ask(lc,a,b);
        else if(mid+1<=a) ans=ask(rc,a,b);
        else ans=(ask(lc,a,mid)*p[b-mid]+ask(rc,mid+1,b))%MOD;
        pull(me);return ans;
    }
    bool query(int x,int low,int high,int a,int b,int lo,int len)
    {
        if(low==a&&high==b)
        {
            int siz=high-low+1;
            a-=lo;b-=lo;
            int ak=a/len,bk=b/len;
            int ar=a%len,br=b%len;
            if(ak==bk)
            {
                //printf("[%d,%d] %d %d\n",low,high,ask(1,1,n,lo+ar,lo+br),dat[x]);
                return ask(1,1,n,lo+ar,lo+br)==dat[x];
            }
            ll ver=calc(bk-ak-1-1,p[len]).second*ask(1,1,n,lo,lo+len-1)%MOD;
            ver=(ver*p[br+1]+ask(1,1,n,lo,lo+br))%MOD;
            ver=(ver+ask(1,1,n,lo+ar,lo+len-1)*p[siz-(len-ar)])%MOD;//0 1 2 3 4
            //printf("[%d,%d] %lld %d\n",low,high,ver,dat[x]);
            return ver==dat[x];
        }
        Mid;push(me);
        bool ret=0;
        if(b<=mid) ret=query(lc,a,b,lo,len);
        else if(mid+1<=a) ret=query(rc,a,b,lo,len);
        else ret=(query(lc,a,mid,lo,len)&&query(rc,mid+1,b,lo,len));
        pull(me);return ret;
    }
} seg;
void build()
{
    p[0]=1;
    REP1(i,1,maxn-1) p[i]=p[i-1]*BAS%MOD;
    //REP1(i,1,20) printf("%lld ",calc(i,BAS).second);puts("");
    memset(seg.tag,-1,sizeof(seg.tag));
    REP(i,n) seg.add(1,1,n,i+1,i+1,s[i]-'0');
}
void sol()
{
    int q=m+k;
    while(q--)
    {
        int o,l,r,x;RI(o,l,r,x);
        if(o==1)
        {
            seg.add(1,1,n,l,r,x);
        }
        else
        {
            bool ok=seg.query(1,1,n,l,r,l,x);
            puts(ok?"YES":"NO");
        }
    }
}
int main()
{
    read();
    build();
    sol();
    return 0;
}


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <functional>
#include <queue>
#define pf(x) ((x)*(x))
#define D(x) (1/x)
#define LL long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const double PI=3.141592653589793;
const LL N = 3e5 + 10;
const LL P = 1e9 + 7;
const LL M = 1e9 + 9;
char ch[N];
struct Segtree{
    LL l,r;
    LL lazy;
    LL hash;
}tr[N * 4];
LL f[N];
LL n,m,k;
LL g[N];
LL sg[N];

void Get_Hash(LL id)
{
    tr[id].hash = ( tr[lid].hash * g[ tr[rid].r - tr[rid].l + 1LL] + tr[rid].hash ) % M;
}

void print(LL id,LL l,LL r)
{
    printf("ID=%I64d L=%I64d R=%I64d lazy=%I64d hash=%I64d\n",id,l,r,tr[id].lazy,tr[id].hash);
    if(l==r) return;
    print(lid,tr[lid].l,tr[lid].r);
    print(rid,tr[rid].l,tr[rid].r);
}

void Initializer_Segtree(LL id,LL l,LL r)
{
    tr[id].lazy = 0;
    tr[id].l = l;
    tr[id].r = r;
    if(l == r)
    {
        tr[id].hash = ch[l - 1] - '0' + 1LL;
        return;
    }
    LL mid = (l + r) >> 1;
    Initializer_Segtree(lid,l,mid);
    Initializer_Segtree(rid,mid+1,r);
    Get_Hash(id);
}

void Change_Hash(LL id,LL l,LL r,LL num )
{
    if( tr[id].l == l && tr[id].r == r )
    {
        tr[id].lazy = num;
        tr[id].hash = (num * sg[r - l + 1LL]) % M;
        return;
    }

    if(tr[id].lazy > 0)
    {
        Change_Hash(lid,tr[lid].l,tr[lid].r,tr[id].hash);
        Change_Hash(lid,tr[rid].l,tr[rid].r,tr[id].hash);
        tr[id].lazy = 0;
    }
    if( tr[lid].r >= l ) Change_Hash( lid , l , min(r,tr[lid].r) , num );
    if( tr[rid].l <= r ) Change_Hash( rid , max(l,tr[rid].l) , r,num );
    Get_Hash(id);
}

LL Get_Hash(LL id,LL l,LL r)
{
   // cout<<id<<" "<<l<<" "<<r<<endl;
    if( tr[id].lazy > 0 )
    {
        tr[lid].lazy = tr[id].lazy;
        tr[rid].lazy = tr[id].lazy;
        tr[id].hash = (tr[id].lazy * sg[r - l + 1LL]) % M;
        tr[id].lazy = 0;
    }

    if( tr[id].l == l &&  tr[id].r == r)
      return tr[id].hash;

    LL s1,s2;
    s1 = s2 = 0;
    if( tr[lid].r >= l ) s1 = Get_Hash( lid , l , min(r,tr[lid].r) );
    if( tr[rid].l <= r ) s2 = Get_Hash( rid , max(l,tr[rid].l) , r );
    return s2 == 0 ? s1 : ( s1 * g[ r - tr[rid].l + 1 ] + s2 ) % M;
}

void init()
{
    scanf("%I64d%I64d%I64d",&n,&m,&k);
    scanf("%s",ch);
    g[1] = sg[1] = 1;
    for(LL i = 2;i <= n; i++ )
    {
        g[i] = ( g[i - 1] * P) % M;
        sg[i] = (g[i] + sg[i-1] ) % M;
    }

    Initializer_Segtree(1,1,n);
}

void work()
{
    LL sign,l,r,l0;
    LL num;
    for(LL i = 1;i <= m + k; i++)
    {
        scanf("%I64d",&sign);
        if(sign == 1)
        {
            scanf("%I64d %I64d %I64d",&l,&r,&num);
            Change_Hash(1,l,r,num+1LL);
        }
        else
        {
            scanf("%I64d %I64d %I64d",&l,&r,&l0);
            if( Get_Hash(1,l,r-l0) == Get_Hash(1,l+l0,r)) printf("YES\n");
            else printf("NO\n");
        }
    }
}

int main()
{
    init();
    work();

    return 0;
}


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <functional>
#include <queue>
#define pf(x) ((x)*(x))
#define D(x) (1/x)
#define LL long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const double PI=3.141592653589793;
const LL N = 3e5 + 10;
const LL P = 1e9 + 7;
const LL M = 1e9 + 9;
char ch[N];
struct Segtree{
    LL l,r;
    LL lazy;
    LL hash;
}tr[N * 4];
LL f[N];
LL n,m,k;
LL g[N];
LL sg[N];

void Get_Hash(LL id)
{
    if(tr[rid].lazy > -1) tr[rid].hash = tr[rid].lazy * sg[ tr[rid].r - tr[rid].l + 1 ];
    if(tr[lid].lazy > -1) tr[lid].hash = tr[lid].lazy * sg[ tr[lid].r - tr[lid].l + 1 ];
    tr[id].hash = ( tr[lid].hash * g[ tr[rid].r - tr[rid].l + 2LL] + tr[rid].hash ) % M;
}

void print(LL id,LL l,LL r)
{
    printf("ID=%I64d L=%I64d R=%I64d lazy=%I64d hash=%I64d\n",id,l,r,tr[id].lazy,tr[id].hash);
    if(l==r) return;
    print(lid,tr[lid].l,tr[lid].r);
    print(rid,tr[rid].l,tr[rid].r);
}

void Initializer_Segtree(LL id,LL l,LL r)
{
    tr[id].lazy = -1;
    tr[id].l = l;
    tr[id].r = r;
    if(l == r)
    {
        tr[id].hash = ch[l - 1] - '0' ;
        return;
    }
    LL mid = (l + r) >> 1;
    Initializer_Segtree(lid,l,mid);
    Initializer_Segtree(rid,mid+1,r);
    Get_Hash(id);
}

void Change_Hash(LL id,LL l,LL r,LL num )
{
    if( tr[id].l == l && tr[id].r == r )
    {
        tr[id].lazy = num;
        tr[id].hash = (num * sg[r - l + 1LL]) % M;
        return;
    }

    if(tr[id].lazy > -1)
    {
        Change_Hash(lid,tr[lid].l,tr[lid].r,tr[id].lazy);
        Change_Hash(lid,tr[rid].l,tr[rid].r,tr[id].lazy);
        tr[id].lazy = -1;
    }

    if( tr[lid].r >= l ) Change_Hash( lid , l , min(r,tr[lid].r) , num );
    if( tr[rid].l <= r ) Change_Hash( rid , max(l,tr[rid].l) , r,num );
    Get_Hash(id);
}

LL Find_Hash(LL id,LL l,LL r)
{
    if(l>r) return 0;
  //  cout<<id<<" "<<l<<" "<<r<<endl;
    if( tr[id].lazy > -1 )
    {
        tr[lid].lazy = tr[id].lazy;
        tr[rid].lazy = tr[id].lazy;
        tr[id].hash = (tr[id].lazy * sg[ tr[id].r - tr[id].l + 1LL]) % M;
        tr[id].lazy = -1;
    }
    if( tr[id].l == l &&  tr[id].r == r)
      return tr[id].hash;

    LL s1,s2;
    s1 = s2 = 0;
    if( tr[lid].r >= l ) s1 = Find_Hash( lid , l , min(r,tr[lid].r) );
    if( tr[rid].l <= r ) s2 = Find_Hash( rid , max(l,tr[rid].l) , r );
    return s2 == 0 ? s1 : ( s1 * g[ r - tr[rid].l + 2LL ] + s2 ) % M;
}

void init()
{
    scanf("%I64d%I64d%I64d",&n,&m,&k);
    scanf("%s",ch);
    g[1] = sg[1] = 1LL;
    for(LL i = 2;i <= n + 5; i++ )
    {
        g[i] = ( g[i - 1] * P) % M;
        sg[i] = (g[i] + sg[i-1] ) % M;
    }

    Initializer_Segtree(1,1,n);
}

void work()
{
    LL sign,l,r,l0,num;
    for(LL i = 1;i <= m + k; i++)
    {
        scanf("%I64d",&sign);
        if(sign == 1)
        {
            scanf("%I64d %I64d %I64d",&l,&r,&num);
            Change_Hash(1,l,r,num);
        }
        else
        {
            scanf("%I64d %I64d %I64d",&l,&r,&l0);
            if( Find_Hash(1,l,r-l0) == Find_Hash(1,l+l0,r)) printf("YES\n");
            else printf("NO\n");
        }
    }
}

int main()
{
    init();
    work();

    return 0;
}


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <functional>
#include <queue>
#define pf(x) ((x)*(x))
#define D(x) (1/x)
#define LL long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const double PI=3.141592653589793;
const LL N = 3e5 + 10;
const LL P = 1e9 + 7;
const LL M = 1e9 + 9;
char ch[N];
struct Segtree{
    LL l,r;
    LL lazy;
    LL hash;
}tr[N * 4];
LL f[N];
LL n,m,k;
LL g[N];
LL sg[N];

void Get_Hash(LL id)
{
    tr[id].hash = ( tr[lid].hash * g[ tr[rid].r - tr[rid].l + 1LL] + tr[rid].hash ) % M;
}

void print(LL id,LL l,LL r)
{
    printf("ID=%I64d L=%I64d R=%I64d lazy=%I64d hash=%I64d\n",id,l,r,tr[id].lazy,tr[id].hash);
    if(l==r) return;
    print(lid,tr[lid].l,tr[lid].r);
    print(rid,tr[rid].l,tr[rid].r);
}

void Initializer_Segtree(LL id,LL l,LL r)
{
    tr[id].lazy = 0;
    tr[id].l = l;
    tr[id].r = r;
    if(l == r)
    {
        tr[id].hash = ch[l - 1] - '0' + 1LL;
        return;
    }
    LL mid = (l + r) >> 1;
    Initializer_Segtree(lid,l,mid);
    Initializer_Segtree(rid,mid+1,r);
    Get_Hash(id);
}

void Change_Hash(LL id,LL l,LL r,LL num )
{
    if( tr[id].l == l && tr[id].r == r )
    {
        tr[id].lazy = num;
        tr[id].hash = (num * sg[r - l + 1LL]) % M;
        return;
    }

    if(tr[id].lazy > 0)
    {
        Change_Hash(lid,tr[lid].l,tr[lid].r,tr[id].hash);
        Change_Hash(lid,tr[rid].l,tr[rid].r,tr[id].hash);
        tr[id].lazy = 0;
    }
    if( tr[lid].r >= l ) Change_Hash( lid , l , min(r,tr[lid].r) , num );
    if( tr[rid].l <= r ) Change_Hash( rid , max(l,tr[rid].l) , r,num );
    Get_Hash(id);
}

LL Get_Hash(LL id,LL l,LL r)
{
    if(l>r) return 0;
   // cout<<id<<" "<<l<<" "<<r<<endl;
    if( tr[id].lazy > 0 )
    {
        tr[lid].lazy = tr[id].lazy;
        tr[rid].lazy = tr[id].lazy;
        tr[id].hash = (tr[id].lazy * sg[r - l + 1LL]) % M;
        tr[id].lazy = 0;
    }

    if( tr[id].l == l &&  tr[id].r == r)
      return tr[id].hash;

    LL s1,s2;
    s1 = s2 = 0;
    if( tr[lid].r >= l ) s1 = Get_Hash( lid , l , min(r,tr[lid].r) );
    if( tr[rid].l <= r ) s2 = Get_Hash( rid , max(l,tr[rid].l) , r );
    return s2 == 0 ? s1 : ( s1 * g[ r - tr[rid].l + 1 ] + s2 ) % M;
}

void init()
{
    scanf("%I64d%I64d%I64d",&n,&m,&k);
    scanf("%s",ch);
    g[1] = sg[1] = 1;
    for(LL i = 2;i <= n; i++ )
    {
        g[i] = ( g[i - 1] * P) % M;
        sg[i] = (g[i] + sg[i-1] ) % M;
    }

    Initializer_Segtree(1,1,n);
}

void work()
{
    LL sign,l,r,l0;
    LL num;
    for(LL i = 1;i <= m + k; i++)
    {
        scanf("%I64d",&sign);
        if(sign == 1)
        {
            scanf("%I64d %I64d %I64d",&l,&r,&num);
            Change_Hash(1,l,r,num+1LL);
        }
        else
        {
            scanf("%I64d %I64d %I64d",&l,&r,&l0);
            if( Get_Hash(1,l,r-l0) == Get_Hash(1,l+l0,r)) printf("YES\n");
            else printf("NO\n");
        }
    }
}

int main()
{
    init();
    work();

    return 0;
}


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <functional>
#include <queue>
#define pf(x) ((x)*(x))
#define D(x) (1/x)
#define LL long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const double PI=3.141592653589793;
const LL N = 3e5 + 10;
const LL P = 1e9 + 7;
const LL M = 1e9 + 9;
char ch[N];
struct Segtree{
    LL l,r;
    LL lazy;
    LL hash;
}tr[N * 4];
LL f[N];
LL n,m,k;
LL g[N];
LL sg[N];

void Get_Hash(LL id)
{
    if(tr[rid].lazy > -1) tr[rid].hash = tr[rid].lazy * sg[ tr[rid].r - tr[rid].l + 1 ];
    if(tr[lid].lazy > -1) tr[lid].hash = tr[lid].lazy * sg[ tr[lid].r - tr[lid].l + 1 ];
    tr[id].hash = ( tr[lid].hash * g[ tr[rid].r - tr[rid].l + 2LL] + tr[rid].hash ) % M;
}

void print(LL id,LL l,LL r)
{
    printf("ID=%I64d L=%I64d R=%I64d lazy=%I64d hash=%I64d\n",id,l,r,tr[id].lazy,tr[id].hash);
    if(l==r) return;
    print(lid,tr[lid].l,tr[lid].r);
    print(rid,tr[rid].l,tr[rid].r);
}

void Initializer_Segtree(LL id,LL l,LL r)
{
    tr[id].lazy = -1;
    tr[id].l = l;
    tr[id].r = r;
    if(l == r)
    {
        tr[id].hash = ch[l - 1] - '0' + 1;
        return;
    }
    LL mid = (l + r) >> 1;
    Initializer_Segtree(lid,l,mid);
    Initializer_Segtree(rid,mid+1,r);
    Get_Hash(id);
}

void Change_Hash(LL id,LL l,LL r,LL num )
{
    if( tr[id].l == l && tr[id].r == r )
    {
        tr[id].lazy = num;
        tr[id].hash = (num * sg[r - l + 1LL]) % M;
        return;
    }

    if(tr[id].lazy > -1)
    {
        Change_Hash(lid,tr[lid].l,tr[lid].r,tr[id].lazy);
        Change_Hash(rid,tr[rid].l,tr[rid].r,tr[id].lazy);
        tr[id].lazy = -1;
    }

    if( tr[lid].r >= l ) Change_Hash( lid , l , min(r,tr[lid].r) , num );
    if( tr[rid].l <= r ) Change_Hash( rid , max(l,tr[rid].l) , r,num );
    Get_Hash(id);
}

LL Find_Hash(LL id,LL l,LL r)
{
    if(l>r) return 0;
    if( tr[id].lazy > -1 )
    {
        tr[lid].lazy = tr[id].lazy;
        tr[rid].lazy = tr[id].lazy;
        tr[id].hash = (tr[id].lazy * sg[ tr[id].r - tr[id].l + 1LL]) % M;
        tr[id].lazy = -1;
    }
    if( tr[id].l == l &&  tr[id].r == r)
      return tr[id].hash;

    LL s1,s2;
    s1 = s2 = 0;
    if( tr[lid].r >= l ) s1 = Find_Hash( lid , l , min(r,tr[lid].r) );
    if( tr[rid].l <= r ) s2 = Find_Hash( rid , max(l,tr[rid].l) , r );
    return s2 == 0 ? s1 : ( s1 * g[ r - tr[rid].l + 2LL ] + s2 ) % M;
}

void init()
{
    scanf("%I64d%I64d%I64d",&n,&m,&k);
    scanf("%s",ch);
    g[1] = sg[1] = 1LL;
    for(LL i = 2;i <= n + 5; i++ )
    {
        g[i] = ( g[i - 1] * P) % M;
        sg[i] = (g[i] + sg[i-1] ) % M;
    }

    Initializer_Segtree(1,1,n);
}

void work()
{
    LL sign,l,r,l0,num;
    for(LL i = 1;i <= m + k; i++)
    {
        scanf("%I64d",&sign);
        if(sign == 1)
        {
            scanf("%I64d %I64d %I64d",&l,&r,&num);
            Change_Hash(1,l,r,num + 1LL);
        }
        else
        {
            scanf("%I64d %I64d %I64d",&l,&r,&l0);
            if( Find_Hash(1,l,r-l0) == Find_Hash(1,l+l0,r)) printf("YES\n");
            else printf("NO\n");
        }
    }
}

int main()
{
    init();
    work();

    return 0;
}


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <functional>
#include <queue>
#define pf(x) ((x)*(x))
#define D(x) (1/x)
#define LL long long
#define lid (id<<1)
#define rid (id<<1|1)
using namespace std;
const double PI=3.141592653589793;
const LL N = 3e5 + 10;
const LL P = 233 ;
const LL M = 1e9 + 9;
char ch[N];
struct Segtree{
    LL l,r;
    LL lazy;
    LL hash;
}tr[N * 4];
LL f[N];
LL n,m,k;
LL g[N];
LL sg[N];

void Get_Hash(LL id)
{
    if(tr[rid].lazy > -1) tr[rid].hash = ( tr[rid].lazy * sg[ tr[rid].r - tr[rid].l + 1 ] ) % M;
    if(tr[lid].lazy > -1) tr[lid].hash = ( tr[lid].lazy * sg[ tr[lid].r - tr[lid].l + 1 ] ) % M;
    tr[id].hash = ( tr[lid].hash * g[ tr[rid].r - tr[rid].l + 2LL] + tr[rid].hash ) % M;
}

void print(LL id,LL l,LL r)
{
    printf("ID=%I64d L=%I64d R=%I64d lazy=%I64d hash=%I64d\n",id,l,r,tr[id].lazy,tr[id].hash);
    if(l==r) return;
    print(lid,tr[lid].l,tr[lid].r);
    print(rid,tr[rid].l,tr[rid].r);
}

void Initializer_Segtree(LL id,LL l,LL r)
{
    tr[id].lazy = -1;
    tr[id].l = l;
    tr[id].r = r;
    if(l == r)
    {
        tr[id].hash = ch[l - 1] - '0' + 1LL;
        return;
    }
    LL mid = (l + r) >> 1;
    Initializer_Segtree(lid,l,mid);
    Initializer_Segtree(rid,mid+1,r);
    Get_Hash(id);
}

void Change_Hash(LL id,LL l,LL r,LL num )
{
    if( tr[id].l == l && tr[id].r == r )
    {
        tr[id].lazy = num;
        tr[id].hash = (num * sg[r - l + 1LL]) % M;
        return;
    }

    if(tr[id].lazy > -1)
    {
        Change_Hash(lid,tr[lid].l,tr[lid].r,tr[id].lazy);
        Change_Hash(rid,tr[rid].l,tr[rid].r,tr[id].lazy);
        tr[id].lazy = -1;
    }

    if( tr[lid].r >= l ) Change_Hash( lid , l , min(r,tr[lid].r) , num );
    if( tr[rid].l <= r ) Change_Hash( rid , max(l,tr[rid].l) , r,num );
    Get_Hash(id);
}

LL Find_Hash(LL id,LL l,LL r)
{
    if(l>r) return 0;
    if( tr[id].lazy > -1 )
    {
        tr[lid].lazy = tr[id].lazy;
        tr[rid].lazy = tr[id].lazy;
        tr[id].hash = (tr[id].lazy * sg[ tr[id].r - tr[id].l + 1LL]) % M;
        tr[id].lazy = -1;
    }
    if( tr[id].l == l &&  tr[id].r == r)
      return tr[id].hash;

    LL s1,s2;
    s1 = 0;
    s2 = -1;
    if( tr[lid].r >= l ) s1 = Find_Hash( lid , l , min(r,tr[lid].r) );
    if( tr[rid].l <= r ) s2 = Find_Hash( rid , max(l,tr[rid].l) , r );
    return s2 == -1 ? s1 : ( s1 * g[ r - tr[rid].l + 2LL ] + s2 ) % M;
}

void init()
{
    scanf("%I64d%I64d%I64d",&n,&m,&k);
    scanf("%s",ch);
    g[1] = sg[1] = 1LL;
    for(LL i = 2;i <= n + 5; i++ )
    {
        g[i] = ( g[i - 1] * P) % M;
        sg[i] = (g[i] + sg[i-1] ) % M;
    }

    Initializer_Segtree(1,1,n);
}

void work()
{
    LL sign,l,r,l0,num;
    for(LL i = 1;i <= m + k; i++)
    {
        scanf("%I64d",&sign);
        if(sign == 1)
        {
            scanf("%I64d %I64d %I64d",&l,&r,&num);
            Change_Hash(1,l,r,num + 1LL);
        }
        else
        {
            scanf("%I64d %I64d %I64d",&l,&r,&l0);
            if( Find_Hash(1,l,r-l0) == Find_Hash(1,l+l0,r)) printf("YES\n");
            else printf("NO\n");
        }
    }
}

int main()
{
    init();
    work();

    return 0;
}